作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有这个代码:
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/
我有这个代码: public Class getScrapper() { return MyScrapper.class; } MyScrapper是一个实现 Scrapper 的类界面。为
我是一名优秀的程序员,十分优秀!