Следующий класс:
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 (Windows 64-разрядная, но не должна меняться), но сбой в 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 <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));
}
компилируется и запускается (так что хакеры generics не вызывают каких-либо странных ошибок при исполнении во время выполнения).
Проблема 461: компиляция jclouds-core не работает с использованием ubuntu openjdk