在学习Generics
时,我发现第一个方法m1
成功编译,而第二个方法m2
无法编译,并显示以下错误消息:
类型不匹配:无法从int转换为Long
class Test1 {
<T extends Integer> void m1(T arg) {
long i = arg;
}
void m2(int i) {
Long l = i;// Compilation fails
}
}
有人可以帮助我理解这种行为。
答案 0 :(得分:1)
这是无效的
layer.cornerRadius
因为我是一个原始整数,但l是long类型的对象,所以“转换”不会自动发生
你可以得到那个整数的值
Long l = i;
请注意,与拳击促销原语相关的其他选项可以是:
Long l = Long.valueOf(i);
答案 1 :(得分:1)
您正在尝试利用自动装箱功能将原始值分配给对象类型。但是如果基本类型和包装器对象类型不是同一类型,它就不起作用。例如,如果您更改这样的a = A(3)
方法,它应该可以工作:
m2()
或者您可以使用void m2(long i) {
Long l = i;
}
包装类中的valueOf()
方法,如答案中所述:
Long
但我建议尽可能避免自动装箱。这是不好的做法。你可以在这里阅读这篇文章,为什么它不好:https://effective-java.com/2010/05/the-advantages-and-traps-of-autoboxing/
最后一点,您应该删除类型参数void m2(int i) {
Long l = Long.valueOf(i);
}
的{{1}}类的扩展名,因为Integer
是最终类型,无法扩展。然后你的T
方法看起来像这样:
Integer