2012-04-24 94 views
8

我有以下代码:Java方法返回类的实例<T延伸Somethng>

public <T extends Scrapper> Class<T> getScrapper() { 
    return MyScrapper.class; 
} 

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() 

P.S. 我诚实地尝试搜索整个30-40分钟。

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

+0

如果你只是将设置为 ControlAltDel 2012-04-24 22:50:13

+0

,你会发现它应该不起作用。但我尝试了其他的东西,它的工作。我更新了问题 – 2012-04-24 22:56:07

+0

是的,我已经很累了。我的意思是改变为Scrapper(未参数化),但是它使用类参数进行工作,并且如果这符合您的要求,则正确使用 – ControlAltDel 2012-04-24 22:58:21

回答

10

随着通用方法等getScrapper(),所述呼叫者的方法的确定什么实际类型参数的方法是(在这种情况下T)。调用者可以选择Scrapper的任何子类型作为T,并且您的方法(总是返回MyScrapper.class)不会返回正确的类。

鉴于方法的签名,这个方法的调用者就希望能够做到这一点:

Class<MyOtherScrapper> c = foo.<MyOtherScrapper>getScrapper(); 

更改返回Class<? extends Scrapper>方法使得它不再是一个通用的方法...有呼叫者没有设置类型参数。相反,签名表示该方法返回的某个未知子类型Scrapper的类对象,并且MyScrapper.class确实符合该法案。

+0

谢谢:)看起来像昨天当我问这个问题时,我很累并且很蠢!它本身:) – 2012-04-25 07:23:39

相关问题