2012-05-06 53 views
4

此代碼不編譯:無法覆蓋的方法,因爲名稱衝突

import java.util.List; 

class A { 
    void foo(List l) { } 
} 

class B extends A { 
    void foo(List<?> l) { } 
} 

然而,下面的代碼編譯(在d FOO覆蓋FOO中C)。爲什麼?

class C { 
    void foo(List<?> l) { } 
} 

class D extends C { 
    void foo(List l) { } 
} 
+0

請發佈編譯錯誤 - 它會使問題更容易回答。 –

+0

OK這裏是消息:B中的name clash foo(java.util.List )和A中的foo(java.util.List)具有相同的擦除,但兩者都不會覆蓋另一個。 – Gmacar

回答

2

第二個例子編譯,因爲名單<>從列表導出,而不是倒過來這就是爲什麼第一個例子不能編譯。

+0

這是正確的更簡短的話 – Justin

+1

這是不正確的一般:字符串擴展對象(但不是另一種方式),但第一個例子會編譯。 – Gmacar

+0

@Gmacar - 在這兩個示例中,我沒有看到字符串或對象。 –