Понимание интерфейсов, классов и конструкторов в Java - PullRequest
0 голосов
/ 08 апреля 2011

Сейчас я пытаюсь реализовать этот интерфейс с целым числом, представляющим двоичное число.

Я знаю, что не должен реализовывать to string();, но давайте предположим, что янужно.

Это то, что я написал до сих пор:

public class IPAddressInt implements IPAddress {
private int ipAdress;

public IPAddressInt(int num1,int num2, int num3, int num4){
    String n1=Integer.toBinaryString(num1);
    String n2=Integer.toBinaryString(num2);
    String n3=Integer.toBinaryString(num3);
    String n4=Integer.toBinaryString(num4);

    String finalString=n1+n2+n3+n4;
    this.ipAdress=Integer.parseInt(finalString);
}

public String toString() {
    return this.toString();


}

, когда я пытаюсь вернуть this.ipAdress.toString(); или даже ipAdress.toString(), компилятор говорит, что это Cannot invoke toString() on the primitive type int,и когда я пишу только this.toString();, это работает.Зачем?Я знаю, что int можно преобразовать в строку, и почему this работает, а весь оператор - нет?не должно ли быть так же?все равно я получу то, что хочу?

Спасибо.

Ответы [ 4 ]

4 голосов
/ 08 апреля 2011

Вызов this.toString() просто взорвется - он вызывает тот же метод рекурсивно, без выхода.

Причина, по которой вы не можете вызвать toString напрямую на ipAddress, заключается в том, что int является примитивным типом, и вы не можете вызывать методы для примитивных типов.

Чтобы преобразовать что-либо в строку, используйте String.valueOf(ipAddress).В частности, для int вы можете использовать Integer.toString(ipAddress).

Не совсем понятно, почему вы делаете преобразование в двоичную строку, хотя ... это не похоже нахорошая идея для меня.Любая причина, по которой вы не используете

ipAddress = (num1 << 24) | (num2 << 16) | (num3 << 8) | num4;

(при условии, что каждое значение действительно находится в диапазоне 0-255).

I сильно сомневаюсь, что двоичное представлениедействительно хотите, чтобы вы хотели, особенно учитывая отсутствие дополнения, и что вы пытаетесь затем проанализировать его как десятичное число.

0 голосов
/ 08 апреля 2011

Ваш метод toString рекурсивно вызывает себя и в результате прекратит переполнение стека.

Попробуйте преобразовать ipAdress в строку следующим образом:

public String toString () {return Integer.ToString (ipAdress);}

К вашему сведению, ваша переменная ipAdress содержит опечатку, должна быть ipAddress.

0 голосов
/ 08 апреля 2011

Вероятно, вам нужно реализовать метод toString следующим образом:

public String toString()
{
    return Integer.toString(ipAdress);
}

То, что говорит компилятор, верно, потому что вы не можете вызывать ЛЮБЫЕ методы для примитивных типов.Вы должны обернуть примитив int в Integer, в котором реализован метод toString.Приведенный выше фрагмент кода является более эффективным способом вызова:

return Integer.valueOf(ipAdress).toString();
0 голосов
/ 08 апреля 2011

Когда вы говорите "это работает", я подозреваю, что вы имеете в виду "это компилируется". Если вы действительно вызовете этот метод toString, вы получите переполнение стека или, возможно, просто бесконечный цикл, если ваш компилятор / JVM очень умен.

Чтобы преобразовать int в строку, вызовите Integer.toString(this.ipAdress). (Но желательно правильно написать address: -).)

[ИЗМЕНЕНО, чтобы добавить: после написания этого я вижу, что в другом ответе Джон Скит предпочитает String.valueOf вместо Integer.toString для этой цели. Он очень умный парень и, вероятно, имеет веские причины Это будет означать, что меньше должно измениться, если вы измените тип ipAddress - я имею в виду, например, ipAdress.]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...