java方法返回Class <T的实例扩展Somethng>

Yer*_*yan 9 java generics java-7

我有这个代码:

public <T extends Scrapper> Class<T> getScrapper() {
    return MyScrapper.class;
}
Run Code Online (Sandbox Code Playgroud)

MyScrapper是一个实现Scrapper接口的类.为什么这不起作用?你在JDK7中得到以下错误:

error: incompatible types
required: Class<T>
found:    Class<MyScrapper>
where T is a type-variable:
T extends Scrapper declared in method <T>getScrapper()
Run Code Online (Sandbox Code Playgroud)

PS我老实说试着整整30-40分钟.

更新:如果我声明方法是public Class<? extends Scrapper> getScrapper() {有效的.但我仍然不明白为什么原始声明没有编译.它出什么问题了?

Col*_*inD 10

使用类似的泛型方法getScrapper(),方法的调用者确定方法的实际类型参数是什么(T在本例中).调用者可以选择Scrapperas的任何子类型T,并且您的方法(总是返回MyScrapper.class)将不会返回正确的类.

给定方法的签名,此方法的调用者将期望能够执行此操作:

Class<MyOtherScrapper> c = foo.<MyOtherScrapper>getScrapper();
Run Code Online (Sandbox Code Playgroud)

将方法更改为return Class<? extends Scrapper>将使其不再是通用方法...调用者没有要设置的类型参数.相反,签名表示该方法返回的类对象的一些未知的亚型Scrapper,并且MyScrapper.class不适合该法案.