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

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

附言 老实说,我已经尝试搜索整整 30-40 分钟。

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

最佳答案

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

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

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

改变方法返回Class<? extends Scrapper>使它不再是通用方法......没有类型参数供调用者设置。相反,签名表示该方法返回 Scrapper一些未知子类型 的类对象。 , 和 MyScrapper.class确实符合要求。

关于返回 Class<T extends Somethng> 实例的 java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10307093/

相关文章:

java - 通用的java输入输出设计模式

swift - 制作一个通用的 UITableViewCell Swift

c# - 是否可以让非泛型方法返回泛型类型?

java - 使用 Java 7 使用文件写入不存在的文件

java - MethodHandle 示例在调用 invokeExact 时抛出 WrongMethodTypeException

java - 在日期字段 : Java 中不能使用超过 "2038"的年份

java - 使用 Jython,我需要随机化一个字符串以保持单词完整

java - Tomcat6 和 Java 7

java - 如何使用 spring-ws 和 jaxb 从 WS 响应中提取 SOAP header

c# - Kotlin通用类限制,例如C#'s “class”关键字