【发布时间】:2017-05-23 13:54:19
【问题描述】:
我正在从 Java 7 迁移到 Java 8,并且遇到了这种语言变化。
我有一个带有注释方法的超级接口:
public interface SuperInterface {
@X
SuperInterface getSomething();
}
我有一个带有相同注释方法但返回子接口的子接口:
public interface SubInterface extends SuperInterface {
@X
SubInterface getSomething();
}
当我运行这个测试时,它在 Java 8 中失败,但在 Java 7 中没有:
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
final Method[] methods = SubInterface.class.getMethods();
for (Method method : methods) {
if (method.getAnnotations().length == 0) {
throw new RuntimeException("No annotations found for " + method);
}
}
}
}
接口方法的注解在 Java 7 中被继承,但在 Java 8 中没有,是真的吗?
@X 定义为:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface X {
}
【问题讨论】:
-
没有
javac/java1.8.0_121的复制。我确实在eclipse中得到了错误。您使用的是哪个 java8 编译器? -
为什么返回一个
SuperInterface一个default方法?在 Java7 中,它们都是abstract,但在 Java8 中,它们是default。 -
@Shadov 是的,在 Java 8 中:公共默认 SuperInterface test.SubInterface.getSomething() 但在 Java 7 中:公共抽象 test.SuperInterface SuperInterface.getSomething()
-
好吧,您实际上是在
SubInterface中覆盖了方法getSomething(),因此,根本没有继承方法。可以看到SuperInterface带有反射的擦除方法是 Java 8 之前的一个技术弱点。在 Java 8 中(使用javac),您看不到任何继承方法,而是两种方法,覆盖方法和桥接方法。 bridge 方法将具有 overriding 方法的注解,但不会继承SuperInterface.getSomething()方法的注解。
标签: java eclipse java-8 java-7 eclipse-jdt