为什么这个赋值在Java泛型中是非法的?

为什么这个赋值在Java泛型中是非法的?,java,generics,wildcard,type-parameter,Java,Generics,Wildcard,Type Parameter,我肯定我可能在这里遗漏了一些相当明显的东西,但有没有原因: ArrayList<? extends Number> list = new ArrayList<Number>(); ArrayList如果要使用像T这样的泛型类型类,需要在类中显式声明它。你可以找到官方文件 如果您想使用未知的NK通配符类,可以在前面提到的代码中自由使用If 无论如何,您可以找到一个类似的问题,java中的泛型类应该是这样的 /** *Box类的泛型版本。 *@param要装箱的值的类型 *

我肯定我可能在这里遗漏了一些相当明显的东西,但有没有原因:

ArrayList<? extends Number> list = new ArrayList<Number>();

ArrayList如果要使用像T这样的泛型类型类,需要在类中显式声明它。你可以找到官方文件

如果您想使用未知的NK通配符类,可以在前面提到的代码中自由使用If


无论如何,您可以找到一个类似的问题,java中的泛型类应该是这样的

/**
*Box类的泛型版本。
*@param要装箱的值的类型
*/
公共类箱{
//T代表“类型”
私人T;
公共无效集(T){this.T=T;}
公共T get(){return T;}
}
因此,您可以使用类似于
ArrayList arr=new ArrayList()

来源:

因为:

ArrayList<? extends Number> list = new ArrayList<Number>(); //OK
唯一的警告是。您将无法在列表中添加数字扩展器实例


然而,在这里:

ArrayList<T extends Number> list = new ArrayList<Number>(); //Syntax error
在运行时,当您通过提供一些实类型作为泛型类型参数来声明
YourClass
类型时,将成为实类型,如下所示:

YourClass<Integer> ints; //will work fine
YourClass<Double> doubles; //will work fine
YourClass<Float> floats; //will work fine
YourClass<String> strings; //will NOT work, as String does not extend Number
yourclassints//行吗
你们班双打//行吗
你的班级浮动//行吗
你的班级字符串//将不起作用,因为字符串不扩展数字

请注意,在这里,
T扩展数字
匹配任何扩展
数字
的类型

T
是一个真正的类型,您以前已经介绍过它。这就像写
ArrayList
,这没有什么意义,它只是
ArrayList
。也就是说,
T
必须
extends Number
这一事实必须在您最初声明
T
时,例如在您启动文件
公共类Foo{…}
时已经建立。
ArrayList<T extends Number> list = new ArrayList<Number>(); //Syntax error
public class YourClass<T extends Number> {
....
}
YourClass<Integer> ints; //will work fine
YourClass<Double> doubles; //will work fine
YourClass<Float> floats; //will work fine
YourClass<String> strings; //will NOT work, as String does not extend Number