类<! - 扩展T - >用法

时间:2012-05-13 15:06:01

标签: java

我想知道具有这种语法的用法是什么。我写了一个简单的程序,如下所示,

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>

,它也是一种有效的if语法

3 个答案:

答案 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();