考慮以下情形:參考方法是不明確的,與仿製藥,奇怪的行爲
class C {
void m(Class<?> c1, Class<?> c2) {}
<S, U extends S> void m(S s, U u) {}
}
class x {{
final Class<Integer> cInteger = Integer.class;
final Class<?> cSomething = null;
final C c = new C();
c.m(cInteger, cInteger);
c.m(cSomething, cSomething); // *
}}
使用Oracle的javac,版本1.7.0_01(也是1.7.0,還有的OpenJDK的Java 7和Java 6編譯器),我得到標有// *
行錯誤:
error: reference to m is ambiguous, both method m(Class,Class) in C and method m(S,U) in C match
我不明白爲什麼會這樣:編譯器能夠判斷哪些方法被調用時,靜態類型的參數是Class<Integer>
,但它與有問題。
IntelliJ的代碼分析說,這是好的,以及JRockit(或Sun的Java 6)編譯器。
所以,這裏顯然存在一個錯誤,無論是在那些說這是對的軟件中,還是在那些認爲是錯誤的軟件中。
需要注意的是,如果我刪除綁定的U
(即,如果我聲明m
爲<S, U> void M(S s, U u) {}
,它會通過編譯,而且,使用原始類型的調用(即Class x = null; m(x, x)
)編譯罰款以及。
因此,根據Java規範,這是代碼有效還是無效?
感謝。