为什么隐藏的静态方法在Sun JDK 6下编译,但在OpenJDK 6和7下导致编译失败?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (89)

我写了以下的类:

public class StaticMethodsDemo {

    public static class A {
        public static A make() { return new A(); };
    }
    public static class B extends A {
        public static B make() { return new B(); };
    }
    public static class BPrime<T> extends A {
        public static <T> BPrime<T> make() { return new BPrime<T>(); };
    }

    public static void main(String[] args) {
        B.make();
        // compiles under Sun JDK 1.6.0_20 but fails under Oracle JDK 1.7.0_01. Why?
        BPrime.<Object>make();
    }
}

在Sun JDK 1.6.0_20下编译,但在Oracle JDK 1.7.0_01和OpenJDK 1.6.0_20(Ubuntu)下编译失败:

[ERROR] StaticMethodsDemo.java:[37,14] error: reference to make is ambiguous, both method make() in A and method <T>make() in BPrime match

...
public static class BPrime<T> extends A {
    T val;
    public static BPrime<?> make() { return new BPrime<Object>(); };
    public void setT(T val) { this.val = val; }
}

public static void main(String[] args) {
    B.make();
    BPrime<Long> bprime = (BPrime<Long>) BPrime.make();
    bprime.setT(Long.valueOf(10));
}
提问于
用户回答回答于

你可以规范解释说:

上述条款意味着非泛型方法可能适用于提供显式类型参数的调用。事实上,它可能会变得适用。在这种情况下,类型参数将被忽略。 这一规则源自兼容性问题和可替代性原则。由于接口或超类可以独立于它们的子类型进行基因化,所以我们可以用非泛型类覆盖泛型方法。但是,重写(非泛型)方法必须适用于对泛型方法的调用,包括显式传递类型参数的调用。否则,该亚型不会被它的generified超型替代。

我们必须允许像这样的无意义语法:

    System.<String,Integer>currentTimeMillis();

扫码关注云+社区

领取腾讯云代金券