Java - 通过模板比较长值

时间:2013-06-22 23:12:58

标签: java templates

有人能解释一下这个结果吗?

这是我的代码:

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的数字都不相等?

谢谢!

3 个答案:

答案 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是由于它的两个输入的类型不相同这一事实引起的,因此存在导致其差异的基础铸造。