我在JAVA中有以下代码:
List <? extends Number > l3=new List<Number>() ; // List not allowed ? why . and why arrayList is allowed here
Integer i=new Integer(5);
l3.add(i); // why we can not add i to l3 .
// ------------- 另一件事:
List <?> variablex;
variablex.add(new Integer(5) ); // error ? so why ?
我想知道为什么我在编译时遇到这些错误?
答案 0 :(得分:4)
您必须具有List
的具体实施,例如ArrayList
或LinkedList
。
List <? extends Number> l3 = new ArrayList<Number>() ;
每当你有一个通配符作为引用变量的泛型类型参数时,它就可以代表任何东西。在这里,对于? extends Number
,它可以是Number
(或Number
)本身的任何子类。它可能是List<Double>
。为了保持类型安全,编译器必须禁止使用add
来调用Integer
,因为l3
可能是List<Double>
,并且您不应该被允许添加Integer
List
Double
可能是List<?>
。使用List<?> l3 = new ArrayList<Number>();
// Later...
l3 = new LinkedList<MySpecialTypeYouDidntKnowAbout>();
// And then this doesn't work.
l3.add(new Integer(5));
,通配符可以代表任何内容。
{{1}}
答案 1 :(得分:1)
List
在接口中,您无法实例化接口。
ArrayList
是List
接口的实现,您只能创建类的对象。