【问题标题】:strange Java compilation error with typed interface带有类型化接口的奇怪 Java 编译错误
【发布时间】: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());

突然间一切都很好了。

同样,如果我从接口中删除类型参数,它会起作用。

我可以理解,如果我们没有正确输入PluginDrivergetBuilder() 方法可能无法正常工作。

但它怎么可能抱怨getStrings() 方法呢?

==编辑

这不是Combining Raw Types and Generic Methods 的重复,因为该问题是指带有类型参数的方法。我要问的方法是无类型的。

【问题讨论】:

标签: java generics interface


【解决方案1】:

JLS 说, “未从其超类或超接口继承的原始类型 C 的构造函数(第 8.8 节)、实例方法(第 8.4 节、第 9.4 节)或非静态字段(第 8.3 节)的类型是对应的原始类型在对应于 C 的泛型声明中擦除其类型。” http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.8

当你声明一个原始接口类型的变量时,你强制成员方法也有原始类型。这就是搞砸班级演员的原因。

文档规则。

【讨论】:

    【解决方案2】:

    这里:

    PluginDriver driver = DriverManager.getDriver(transformer.getPlugin());
    

    您正在创建 原始 类型。坏主意。

    可能导致各种问题 - 请参阅 here

    因此答案很简单:永远不要那样做!当您使用泛型类型时,请确保在声明/定义的(一侧/两侧)都有“泛型”!

    【讨论】:

    • 我知道我们正在创建一个原始类型,这不是一个好主意。但我不明白它如何影响像 getStrings() 这样的非类型化方法。
    • 我想我听说过当你使用原始类型时,一切都会变得原始。所以你的getStrings() 不再返回Set&lt;String&gt;,而是原始的Set。这可以解释为什么 for (String s : driver.getStrings()) 无法编译。
    猜你喜欢
    • 2017-08-27
    • 2014-08-29
    • 1970-01-01
    • 2017-11-06
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多