Почему скрытый статический метод компилируется под Sun JDK 6, но вызывает сбой компиляции под OpenJDK 6 и 7?

Следующий класс:

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 extends A {
        public static  BPrime make() { return new BPrime(); };
    }

    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.make();
    }
}

компилируется под Sun JDK 1.6.0_20 (64-битная Windows, но не должно иметь значения), но терпит неудачу под Oracle JDK 1.7. 0_01 (та же платформа) и OpenJDK 1.6.0_20 (Ubuntu) [1] с:

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

Почему? Как общий параметр (который следует стереть, нет?) Вызывает это очевидное несоответствие. Обратите внимание, что удаление дженериков происходит следующим образом:

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

public static void main(String[] args) {
    B.make();
    BPrime bprime = (BPrime) BPrime.make();
    bprime.setT(Long.valueOf(10));
}

также компилируется и запускается (так что взлом дженериков не вызывает каких-либо странных ошибок приведения типов во время выполнения).

Проблема 461: компиляция jclouds-core не выполняется с использованием стандартного ubuntu openjdk

17
задан Andrew Phillips 23 December 2011 в 23:05
поделиться