我想知道具有这种语法的用法是什么。我写了一个简单的程序,如下所示,
public class Sample{
public static void main(String[] args) {
Class<? extends Collection> someCollectionClass = someMethod();
}
public static ArrayList someMethod() {
return new ArrayList();
}
}
为什么它将编译错误显示为
- Collection is a raw type. References to generic type Collection<E> should be
parameterized
- Type mismatch: cannot convert from ArrayList to Class<? extends Collection>
在这里,该类期望一个类(它实际上是它接受的对象,它是吗?是吗?)确实扩展了Collection。那么ArrayList怎么了?
如果我将某些内容声明为Class<? extends T>
答案 0 :(得分:5)
因为ArrayList
不是Class
。也许你的意思是someMethod().getClass()
?
答案 1 :(得分:1)
第一条错误消息源于声明中的type参数:
Class<? extends Collection> someCollectionClass = someMethod();
类型Collection
是Java中所谓的“原始类型”,因为接口Collection
接受类型参数,但声明中没有给出。这同样适用于ArrayList
的简单使用。
但是,声明实际上并不是我认为你认为它做的...你实际上声明了一个名为someCollectionClass
的变量,你可以为其分配Class<? extends Collection>
类型的实例,即(反射)类描述符(特定类型)。第二条错误消息是编译器抱怨:类型ArrayList
的实例(由someMethod
返回)无法分配给变量,其类型被声明为“仅允许{{1}的实例(这是一种描述类的特殊Java运行时类型)。
Class<...>
答案 2 :(得分:0)
someMethod返回一个List类型的实例,你试图将它分配给一个期望Collection类不是实例的变量。以下代码应该可以使用。
Collection someCollectionClass = someMethod();