【发布时间】:2018-01-29 14:16:36
【问题描述】:
这是一个演示问题的简单类:
package com.mimvista.debug;
public class DefaultCollisionTest {
public static interface Interface1 {
public String getName();
}
public static interface Interface2 {
public default String getName() { return "Mr. 2"; };
}
public static <X extends Interface1&Interface2> String extractName(X target) {
return target.getName();
}
}
Eclipse (Neon 2) 愉快地编译这个类,而 javac (JDK 1.8.0_121) 吐出以下编译错误:
$ javac src/com/mimvista/debug/DefaultCollisionTest.java
src\com\mimvista\debug\DefaultCollisionTest.java:13: error: class INT#1 inherits abstract and default for getName() from types Interface2 and Interface1
public static <X extends Interface1&Interface2> String extractName(X target) {
^
where INT#1 is an intersection type:
INT#1 extends Object,Interface1,Interface2
1 error
我相信 Eclipse 在这种情况下是正确的,但我并不完全确定。根据我对“继承抽象和默认”错误的理解,我认为它应该只在编译实现这两个接口的实际声明类时生成。似乎 javac 可能在后台生成一个中间类来处理该通用签名并错误地对其进行默认方法冲突测试?
【问题讨论】:
-
由于游戏的目的是编写 javac 可以编译的东西,根据定义,javac 是正确的,除非你遇到了一个不起眼的错误,就像这里发生的那样:stackoverflow.com/questions/42485052/…。
-
@slim 我不确定是谁定义了你所指的两个游戏。 Java 是由 JLS 而不是 javac 定义的 :) 任何编译器的开发人员都依赖于报告此类错误的用户来修复他们各自的编译器。直到 s.o.证明 howlger 的回答是错误的,这确实应该被视为 javac 中的一个错误。
-
@BonusLord,您关于幕后中级阶级的假设对我来说非常有说服力。它将准确地解释我们所看到的。
-
任何仍有疑问的人可能想在stackoverflow.com/questions/34644237/…阅读 Brian Goetz 的回答
标签: java eclipse generics java-8 javac