我有这段代码:
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 :(得分:10)
使用类似getScrapper()
的通用方法,方法的调用方确定方法的实际类型参数是什么(在这种情况下为T
)。调用者可以选择Scrapper
的任何子类型作为T
,并且您的方法(始终返回MyScrapper.class
)将不会返回正确的类。
鉴于方法的签名,此方法的调用者希望能够执行此操作:
Class<MyOtherScrapper> c = foo.<MyOtherScrapper>getScrapper();
将方法更改为返回Class<? extends Scrapper>
使其不再是通用方法...没有用于设置调用者的类型参数。相反,签名表示该方法返回 Scrapper
的某个未知子类型的类对象,而MyScrapper.class
确实适合该帐单。