0

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

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>

在这里,该类是否期望一个扩展集合的类(它实际上是它接受的对象知道,是吗?)。那么 ArrayList 有什么问题呢?

如果我将某些东西声明为,它也是有效的 if 语法吗Class<? extends T>

4

3 回答 3

5

因为ArrayList不是一个Class。也许你的意思是someMethod().getClass()

于 2012-05-13T15:08:31.273 回答
1

第一条错误消息源于声明中的类型参数:

Class<? extends Collection> someCollectionClass = someMethod();

该类型Collection在 Java 中被称为“原始类型”,因为接口Collection采用类型参数,但在声明中没有给出。这同样适用于ArrayList.

但是,该声明实际上并没有像我猜你认为的那样做......你实际上声明了一个名为 的变量someCollectionClass,你可以为其分配 type 的实例Class<? extends Collection>,即(反射)类描述符(特定类型)。第二条错误消息是编译器抱怨:不能将类型的实例ArrayList(由返回someMethod)分配给变量,其类型被声明为“只允许Class<...>(这是一种描述类的特殊 Java 运行时类型)的实例。

Collection someCollection = someMethod(); 
于 2012-05-13T15:14:43.577 回答
0

someMethod 正在返回 List 类型的实例,您试图将其分配给期望 Collection 类而不是实例的变量。以下代码应该可以工作。

Collection someCollectionClass = someMethod();
于 2012-05-13T15:11:17.737 回答