Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类型化接口的奇怪Java编译错误_Java_Generics_Interface - Fatal编程技术网

类型化接口的奇怪Java编译错误

类型化接口的奇怪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(); } 我们还有一个

我遇到了一个非常奇怪的编译错误。起初我认为这是IntelliJ中的一个bug,但现在我尝试了Eclipse,看到了同样的东西

我有以下界面:

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())
无法编译。可能重复的