Java泛型比较数字与字节

时间:2015-07-08 08:37:35

标签: java generics

为什么不能比较ByteNumber/Integer?我附上了我的源代码。查看评论。另外我为什么要把88转换为字节,是不是自动完成了自动装箱和自动拆箱?

package com.practice;

public class Generics<T extends Number>
{
    T ob;

public Generics(T i)
{
    ob = i;
}

T getObj()
{
    return ob;
}

boolean compare(Generics<?> o)
{

    if (this.ob == o.ob)
    {
        return true;
    }
    else
    {
        return false;
    }
}

public static void main(String[] args)
{

    Generics<Number> num = new Generics<>(88);

    // Generics<Byte> Byte = new Generics<>(88); //why this does not
    // compile?

    Generics<Byte> Byte = new Generics<>((byte) 88);

    Generics<Integer> integer = new Generics<>(88);

    System.out.println(num.compare(integer)); // this is true!!
    System.out.println(num.compare(Byte)); // why False?
    System.out.println(integer.compare(Byte)); // Why false?

}

}

1 个答案:

答案 0 :(得分:1)

  

为什么我必须将88转换为字节,是不是自动完成了自动装箱和自动拆箱?

默认情况下,数字文字(如 <tfoot> <tr class="pp-pagenumber"> <td colspan="1"> <a data-swhglnk="true" href="#" >&lt;</a> <a data-swhglnk="true" href="#" id="1" onclick="changeCss(this.id)">1</a> <a data-swhglnk="true" href="#" id="2" onclick="changeCss(this.id)">2</a> <a data-swhglnk="true" href="#" id="3" onclick="changeCss(this.id)">3</a> <a data-swhglnk="true" href="#" id="4" onclick="changeCss(this.id)">4</a> <a data-swhglnk="true" href="#">&gt;</a> </td> </tr> </tfoot> Java Script: function changeCss(id){ $(a).removeClass('changebutton'); $("#"+id).addClass('changebutton'); } css: .changebutton{background-color:green;} )是88。自动装箱确实发生了,但编译器将其分为int而不是Integer,因为正如我刚才所说,它是Byte

int

因为Generics<Number> num = new Generics<>(88); Generics<Integer> integer = new Generics<>(88); IS-A Integer上述两种工作都很好。

Number

现在,在Generics<Byte> Byte = new Generics<>(88); // why this does not compile? 的情况下,构造函数变为Generics<Byte>,由于Generics(Byte i)无法分配给Integer,因此失败了他们之间没有继承权。它们都扩展Byte并且是兄弟类。

Number

因此,要传入Generics<Byte> Byte = new Generics<>((byte) 88); 并满足编译器,需要Byte强制转换。现在再次发生自动装箱,但这次从(byte)byte

关于相等性,您的Byte方法实现存在缺陷,因为它只会比较引用compare()而不是它们的值。

this.ob == o.ob

这适用于整数比较System.out.println(num.compare(integer)); // this is true!! System.out.println(num.compare(Byte)); // why False? System.out.println(integer.compare(Byte)); // Why false? ,因为您选择了一个小值num.compare(integer),它位于 auto之间的JVM缓存和共享的值范围(-128到+127)中已装箱的 88个实例。如果您使用较大的值Integer再次运行程序,则会打印888进行相同的比较。

因此,要修复false方法,您需要对其数值进行排序。

compare()

PS:equals()方法在这里没有帮助。检查源代码以了解原因:)