【发布时间】:2017-02-27 10:29:21
【问题描述】:
我遇到了一个非常奇怪的编译错误。起初我认为这是 IntelliJ 中的一个错误,但现在我尝试使用 Eclipse 并看到同样的情况。
我有如下界面:
public interface PluginDriver<T extends Plugin> {
PluginBuilder<T> getBuilder();
Set<PluginParam> getParams();
Set<String> getStrings();
}
Plugin 是一个抽象类:
public abstract class Plugin
我们还有一个 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,getBuilder() 方法可能无法正常工作。
但它怎么可能抱怨getStrings() 方法呢?
==编辑
这不是Combining Raw Types and Generic Methods 的重复,因为该问题是指带有类型参数的方法。我要问的方法是无类型的。
【问题讨论】: