java方法返回Class <t extends =“”somethng =“”> </t>的实例

时间:2012-04-24 22:48:04

标签: java generics java-7

我有这段代码:

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() {则可行。但我仍然不明白为什么原始声明没有编译。怎么了?

1 个答案:

答案 0 :(得分:10)

使用类似getScrapper()的通用方法,方法的调用方确定方法的实际类型参数是什么(在这种情况下为T)。调用者可以选择Scrapper的任何子类型作为T,并且您的方法(始终返回MyScrapper.class)将不会返回正确的类。

鉴于方法的签名,此方法的调用者希望能够执行此操作:

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

将方法更改为返回Class<? extends Scrapper>使其不再是通用方法...没有用于设置调用者的类型参数。相反,签名表示该方法返回 Scrapper的某个未知子类型的类对象,而MyScrapper.class确实适合该帐单。