现在我正在尝试使用表示二进制数的int来实现this interface。
我知道我不应该实施to string();
,但我们假设我需要。{/ p>
这是我到目前为止写的:
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
如何工作而整个语句不是?不应该是一样的吗?我会得到我想要的东西吗?
谢谢。
答案 0 :(得分:4)
调用this.toString()
只会爆炸 - 它以递归方式调用相同的方法,没有退出。
您无法直接在toString
上调用ipAddress
的原因是int
是基本类型,您无法调用基本类型的方法。
要将任何内容转换为字符串,请使用String.valueOf(ipAddress)
。特别是int
,您可以使用Integer.toString(ipAddress)
。
为什么你首先要转换成二进制字符串并不是很清楚......虽然这对我来说不是一个好主意。你没有使用
的原因ipAddress = (num1 << 24) | (num2 << 16) | (num3 << 8) | num4;
(假设每个值实际上在0-255范围内)。
我高度怀疑二进制表示确实是你想要的,特别是考虑到缺少填充,然后你试图将其解析为十进制号。
答案 1 :(得分:0)
当你说“它有效”时,我怀疑你的意思是“它编译”。如果您实际调用toString
方法,您将获得堆栈溢出,或者如果您的编译器/ JVM非常聪明,可能只是一个无限循环。
要将int
转换为字符串,请致电Integer.toString(this.ipAdress)
。 (但最好是拼写address
正确: - )。)
[编辑补充说:写完之后我看到另一个答案,Jon Skeet为此目的更喜欢String.valueOf
而不是Integer.toString
。他是一个非常聪明的家伙,可能有充分的理由。如果您更改ipAddress
的类型,则意味着更少必须更改 - 例如,我的意思是ipAdress
。]
答案 2 :(得分:0)
你想要的可能是实现这样的toString方法:
public String toString()
{
return Integer.toString(ipAdress);
}
编译器说的是真的,因为你不能在原始类型上调用任何方法。您必须将原语int包装到一个Integer中,该Integer实现了toString方法。上面的代码片段只是一种更有效的调用方式:
return Integer.valueOf(ipAdress).toString();
答案 3 :(得分:0)
你的toString方法以递归方式调用自身,最终会出现堆栈溢出异常。
尝试将ipAdress转换为这样的字符串:
public String toString(){ return Integer.toString(ipAdress); }
仅供参考,你的变量ipAdress有一个拼写错误,应该是ipAddress。