9

我有这个代码:

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

PS 老实说,我已经尝试了整整 30-40 分钟的搜索。

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

4

1 回答 1

11

对于像这样的泛型方法getScrapper(),方法的调用者确定该方法的实际类型参数是什么(T在这种情况下)。Scrapper调用者可以选择as的任何子类型T,并且您的方法(始终返回MyScrapper.class)不会返回正确的类。

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

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

将方法更改为返回Class<? extends Scrapper>使其不再是泛型方法......调用者无需设置类型参数。相反,签名说该方法返回某个未知子类型的类对象Scrapper,并且MyScrapper.class确实符合要求。

于 2012-04-24T22:59:31.970 回答