有人能解释一下这个结果吗?
这是我的代码:
public class foo <T> {
public static void main(String[] args) {
foo Foo = new foo();
System.out.println(Foo.compare(100L, 100));
System.out.println(Foo.compare(100L, 100L));
System.out.println(Foo.compare(127L, 127L));
System.out.println(Foo.compare(128L, 128L));
System.out.println();
System.out.println(System.getProperty("java.vendor"));
System.out.println(System.getProperty("java.version"));
}
public boolean compare( T val1, T val2) {
return ( val1 == val2 ) ? true : false;
}
}
结果是:
false
true
true
false
Sun Microsystems Inc.
1.6.0_26
首先:
这很奇怪,因为我只声明了一个模板类“T”。第一个比较结束为假,因为val1很长,而val2是int(我通过debuger检查了它)。但它不应该是,因为我只声明了一个模板类,并且两者都相同。
和
其次:
为什么每个“长”大于127的数字都不相等?
谢谢!
答案 0 :(得分:3)
在比较函数中,您要比较引用而不是值(==运算符始终比较引用,除非它是内置类型。请参阅此帖子What is the difference between == vs equals() in Java?)。
当您使用泛型时,您的内置类型被打包到java类(例如Integer)。
所以一般来说这段代码会给你所有的错误,但在这种情况下你在第二和第三个例子中都是正确的,因为java编译器缓存范围[-128,127]中的数字,因为它们经常使用,所以它们有相同的记忆中的地址。
答案 1 :(得分:3)
第一个比较结束为假,因为val1很长而val2是 int(我通过debuger检查了它)。但它不应该,因为我 已宣布只有一个庙级,两者都相同。
因为,您使用的是foo Foo = new foo();
而不是foo<Long> Foo = new foo<Long>();
所以foo
正在考虑将任何对象作为参数(因为编译后的,编译器erases all type parameters和<如果类型参数有界,则strong>用替换第一个绑定;如果类型参数无界限,则对象。)
为什么每个“长”大于127的数字都不相等?
因为,您要比较行val1 == val2
中变量的引用,而不是这些变量所指向的对象中包含的值。
现在,我想加入一个问题:
为什么每个
long
小于127
且大于-128
等于?
由于JLS5.1.7
如果框中的值p为true,false,则为字节或字符 范围\ u0000到\ u007f,或 -128到127之间的整数或短数 (包括),然后让r1和r2成为任意两个拳击的结果 转换p。 r1 == r2 总是如此。
答案 2 :(得分:2)
您需要使用equals
而不是==
来执行相等性检查,因为T是对象而不是基元:
public static void main(String[] args) {
foo Foo = new foo();
System.out.println(Foo.compare(100L, 100));
System.out.println(Foo.compare(100L, 100L));
System.out.println(Foo.compare(127L, 127L));
System.out.println(Foo.compare(128L, 128L));
System.out.println();
System.out.println(System.getProperty("java.vendor"));
System.out.println(System.getProperty("java.version"));
}
public boolean compare( T val1, T val2) {
return ( val1.equals(val2) ) ? true : false; // use equal instead
}
这会给你:
false
true
true
true
第一个false
是由于它的两个输入的类型不相同这一事实引起的,因此存在导致其差异的基础铸造。