2017-06-28 38 views
0

虽然学习Generics我发现,这是m1第一种方法编译成功,其中为m2失败,以下错误消息编译第二种方法:分配和泛型编译问题

类型不匹配:不能从int转换为长

class Test1 { 

    <T extends Integer> void m1(T arg) { 
     long i = arg; 
    } 

    void m2(int i) { 
     Long l = i;// Compilation fails 
    } 
} 

有人能帮我理解这种行为。

+0

类型参数T不应由final类型来界定。 –

+0

[Double不能转换为int]的可能重复(https://stackoverflow.com/questions/14088522/double-is-not-converting-to-an-int) – Tom

回答

1

这是无效的

Long l = i; 

,因为我是一个原始的整数,但L较长的类型的对象,使“转换”不会自动发生

就可以得到该值整数

Long l = Long.valueOf(i); 

注意到有关拳击促进原语的另一个选项可以是:

void m2(int i) { 
    long x = i; 
    Long l = x; 
} 
1

您正在试图利用自动装箱功能将原始值分配给对象类型。但如果基元类型和包装器对象类型不是相同的类型,则它不起作用。例如,如果你改变m2()方法就是这样,它应该工作:

void m2(long i) { 
    Long l = i; 
} 

或者你可以使用从Long包装类的valueOf()方法,如在回答中已经说过:

void m2(int i) { 
     Long l = Long.valueOf(i); 
} 

但我会建议尽可能避免自动装箱。这是不好的做法。你可以在这里阅读文章,为什么它是坏的:https://effective-java.com/2010/05/the-advantages-and-traps-of-autoboxing/

最后一点,你应该删除Integer类的扩展类型参数T,作为Integer是最后的类型,不能扩展。然后你m1()方法看起来像这样:

void m1(Integer arg) { 
     long i = arg; 
}