类型化接口的奇怪Java编译错误
我遇到了一个非常奇怪的编译错误。起初我认为这是IntelliJ中的一个bug,但现在我尝试了Eclipse,看到了同样的东西 我有以下界面:类型化接口的奇怪Java编译错误,java,generics,interface,Java,Generics,Interface,我遇到了一个非常奇怪的编译错误。起初我认为这是IntelliJ中的一个bug,但现在我尝试了Eclipse,看到了同样的东西 我有以下界面: public interface PluginDriver<T extends Plugin> { PluginBuilder<T> getBuilder(); Set<PluginParam> getParams(); Set<String> getStrings(); } 我们还有一个
public interface PluginDriver<T extends Plugin> {
PluginBuilder<T> getBuilder();
Set<PluginParam> getParams();
Set<String> getStrings();
}
我们还有一个POJO,如下所示:
public class PluginParam { ... }
现在我有了一个DriverManager来返回PluginDriver的实例,在这里我将尝试使用它:
PluginDriver driver = DriverManager.getDriver(transformer.getPlugin());
PluginBuilder builder = driver.getBuilder();
for (PluginParam o : driver.getParams()) {
//type mismatch - cannot convert from element type Object to PluginParam
}
for (String s : driver.getStrings()) {
//type mismatch: cannot convert from element type Object to String
}
for循环命令无法编译,原因我不明白。该接口为这些方法指定具体的返回类型,而不是类型T
现在,如果我更改以下行:
PluginDriver<Plugin> driver = DriverManager.getDriver(transformer.getPlugin());
PluginDriver-driver=DriverManager.getDriver(transformer.getPlugin());
一切突然变得很好
类似地,如果我从接口中删除类型参数,它也会工作
我可以理解,如果我们没有正确键入PluginDriver
,那么getBuilder()
方法可能无法工作
但是它怎么可能抱怨getStrings()
方法呢
==编辑
这不是的重复,因为该问题涉及具有类型化参数的方法。我要问的方法是非类型化的。这里:
PluginDriver driver = DriverManager.getDriver(transformer.getPlugin());
您正在创建一个原始类型。坏主意
可能会导致各种各样的问题-请参阅
因此答案很简单:永远不要这样做!使用泛型类型时,请确保在声明/定义的(一侧/两侧)上有一个“泛型” 这里:
PluginDriver driver = DriverManager.getDriver(transformer.getPlugin());
您正在创建一个原始类型。坏主意
可能会导致各种各样的问题-请参阅
因此答案很简单:永远不要这样做!使用泛型类型时,请确保在声明/定义的(一侧/两侧)上有一个“泛型” JLS说,
未从其超类或超接口继承的原始类型C的构造函数(§8.8)、实例方法(§8.4,§9.4)或非静态字段(§8.3)的类型是对应于在对应于C的泛型声明中删除其类型的原始类型
声明原始接口类型的变量时,强制成员方法也具有原始类型。这就是为什么班上的演员都搞砸了
文档规则。JLS说,
未从其超类或超接口继承的原始类型C的构造函数(§8.8)、实例方法(§8.4,§9.4)或非静态字段(§8.3)的类型是对应于在对应于C的泛型声明中删除其类型的原始类型
声明原始接口类型的变量时,强制成员方法也具有原始类型。这就是为什么班上的演员都搞砸了
文档规则。我知道我们正在创建一个原始类型,这不是一个好主意。但我不明白它如何可能影响非类型化方法,比如getStrings()。我想我听说过,当使用原始类型时,一切都是原始的。因此,您的
getStrings()
不再返回Set
,而是返回原始Set
。这可以解释为什么for(String s:driver.getStrings())
无法编译。我知道我们正在创建一个原始类型,这不是一个好主意。但我不明白它如何可能影响非类型化方法,比如getStrings()。我想我听说过,当使用原始类型时,一切都是原始的。因此,您的getStrings()
不再返回Set
,而是返回原始Set
。这将解释为什么for(String s:driver.getStrings())
无法编译。可能重复的