2012-05-13 90 views
0

我想知道有这样的语法是什么用法。我已经写了一个简单的程序如下,类<? extends T>用法

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

你可以声明为东西'类',但它并不是指在Java中的任何物体,这就是类'Object'是在这里寻找更多的信息:HTTP:/ /docs.oracle.com/javase/6/docs/api/java/lang/Class.html,但'Class'指的是实际的实现和细节。 – dcpomero

回答

1

第一个错误消息在您的声明中的类型参数茎:

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

类型Collection是所谓Java中的一个“原始型”,因为接口Collection需要一个类型参数,但没有在宣言中提供。这同样适用于ArrayList的未经使用的使用。

然而,该声明实际上并没有做什么,我猜你认为它...你竟然宣布了一个名为someCollectionClass变量,您可以向其中分配Class<? extends Collection>型,即(反射)类描述符的情况下(中特定类型)。第二个错误消息是编译器抱怨:ArrayList(由someMethod返回)的实例不能被分配给一个变量,该变量的类型被声明为“仅允许Class<...>的实例(这是一个特殊的Java运行时类型描述。班)

Collection someCollection = someMethod(); 
+0

请问这样的语法的实际用法是什么?Class <?extends收藏>? – Harshana

5

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

0

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

Collection someCollectionClass = someMethod(); 
相关问题