【问题标题】:Generics function call not compiling in java 8 extending multiple interfaces泛型函数调用未在扩展多个接口的 java 8 中编译
【发布时间】:2014-10-03 21:01:48
【问题描述】:

运行 Java 1.8 JavaSE-1.8 (jdk1.8.0_20)

这个类:

public class SimpleQuestion {

    public static void main(String[] args) {
        DoNothing();
        DoNothing2();
        DoNothing3();
        DoNothing4();
    }    

    public interface Interface1 {
        public void go();
    }

    public interface Interface2<X> {
        public X go2();
    }

    private static <X, T extends Interface2<X> & Interface1> void DoNothing() {
        return;
    }

    private static <X, T extends Interface2 & Interface1> void DoNothing2() {
        return;
    }

    private static <X, T extends Interface2<X>> void DoNothing3() {
        return;
    }

    private static <T extends Interface2<T> & Interface1> void DoNothing4() {
        return;
    }    

}

给出编译错误:

SimpleQuestion类型中的DoNothing()方法不适用于参数()

为什么是那个而不是 DoNothing2、3 和 4?

【问题讨论】:

  • 在 Eclipse 中失败。 Oracle 编译器为我工作。我哭了!
  • 但是,如果您明确提供类型参数,它就可以工作。
  • 在 Java7 中编译得很好;可能是您正在使用的编译器/IDE 中的错误
  • 为什么所有void 方法都有return ; 语句?此外,DoNothing2() 方法会导致编译器错误(untested 但基于我所看到的,因为Interface2 还没有有界)。
  • 我不知道你在说什么,它在 java8 和 java7 中都适用于我。您的软件可能存在问题,或者您可能犯了其他错误。

标签: java eclipse generics java-8 multiple-inheritance


【解决方案1】:

错误消息似乎是指section 18.5.1 of the spec 中定义的算法失败。

对于DoNothing,算法进行如下(使用上述链接中的术语):

  • 类型参数是

    P1 = X

    P2 = T extends Interface2&lt;X&gt; &amp; Interface1

    我将使用 a1 和 a2 作为相应的推理变量。

  • 初始绑定集是

    B0 = {a1 &lt;: Object, a2 &lt;: Interface2&lt;a1&gt;, a2 &lt;: Interface1}

  • 没有参数,因此此时没有添加额外的边界 (B2 = B0)。

  • a2 对 a1 有依赖关系,所以我们先尝试解析 a1。它有一个适当的 Object 上限,所以我们将它实例化为 this。合并a1 = Object 涉及添加绑定

    a2 &lt;: Interface2&lt;Object&gt;

  • 接下来我们解析a2。这现在有两个适当的上限,所以我们将 a2 实例化为它们的 glb:

    a2 = Interface2&lt;Object&gt; &amp; Interface1

  • 现在每个变量都有一个实例化,因此解析成功。

因此,与错误消息相反,DoNothing 的调用应该是适用的。这似乎是您的 Java 编译器中的一个错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-17
    • 2021-10-09
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    相关资源
    最近更新 更多