为什么不能比较Byte
和Number/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?
}
}
答案 0 :(得分:1)
为什么我必须将88转换为字节,是不是自动完成了自动装箱和自动拆箱?
默认情况下,数字文字(如 <tfoot>
<tr class="pp-pagenumber">
<td colspan="1">
<a data-swhglnk="true" href="#" ><</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="#">></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()方法在这里没有帮助。检查源代码以了解原因:)