泛型类型和赋值问题

Ala*_*din 4 java oop generics

我知道,每个泛型类型变量都替换为上限,该上限是从方法"类型 - 参数部分"的开头的通用定义中确定的.

这是来自Deitel的书

实际上,所有类型参数都被类型参数的所谓上限替换,该参数在类型参数部分中指定.

据此,这个子码必须是真的

public  static <E extends Number> void A(  )
 {

E x=  new Double(2.2);

 }
Run Code Online (Sandbox Code Playgroud)

但是编译器告诉我E x = new Double(2.2)中的编译错误 ; ,虽然这必须是真的,因为双数是.

我知道如何通过施法来处理和解决问题,但我问为什么会发生这种情况?

gre*_*dha 6

仅仅因为E是一个数字并不意味着它是一个Double.

可以这样想,如果E是整数,那该怎么办?E仍然是一个数字,但现在您将Double分配给整数.因此,铸造行为是一致的,Number可以是各种不同的类型,因此E.

编辑操作:Deitel语句仍然正确,如果您将Double分配给一个数字或一个对象,那么您将不需要转换.但在这种情况下,E不分配"向上",它在两个可能的不同数字类型之间"横向"分配.如果E是Short或Integer,在这些情况下你不希望能够在没有强制转换的情况下为它们分配Double.