为什么这个赋值在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