作业和泛型编译问题

时间:2017-06-28 10:46:26

标签: java generics

在学习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
    }
}

有人可以帮助我理解这种行为。

2 个答案:

答案 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