2010-12-16 123 views
2

當我新的仿製藥,我希望得到任何幫助,我可以用下面的問題得到:Java泛型名稱衝突擴展

我有這樣的父類:

public class Parent<K, V> { 
    public void f(K key,V value){} 
} 

然後,我有這個子類:

public class Child<K,V> extends Parent<K,LinkedList<V>> { 
    @Override 
    public void f(K key,V value) {} 
} 

好了,我們希望在Child.f會覆蓋Parent.f,但不幸的是編譯器不喜歡什麼是怎麼回事和連鎖行業上課我:

Name clash: The method f(K, V) of type Child<K,V> has the same erasure as f(K, V) of type Parent<K,V> but does not override it

我曾在不同的上下文中見過這個錯誤,但我不知道爲什麼在這個特殊的出現。有什麼方法可以避免嗎?

在此先感謝。

+0

爲什麼孩子延長'Parent >'而不是'Parent '? – DGH 2010-12-16 21:42:42

+0

因爲Parent是一個HashMap的形式,而Child是一個MultiMap。但我需要覆蓋某些方法來確保效率。只是實例化一個'HashMap >'不適合我的情況。 – delmet 2010-12-16 22:02:20

回答

2

您對V有兩種不同的含義。將V重命名爲W,應該看起來像這樣。這裏V在父是LinkedList的< W>

public class Child<K,W> extends Parent<K,LinkedList<W>> { 
    @Override 
    public void f(K key,LinkedList<W> value) {} 
} 

BTW:它是否真的要成爲一個具體的LinkedList類,不能使它名單。

編輯:或許您在特定情況下需要將您需要的東西與您想要定義爲通用定義的東西混淆。例如

public class Child<K,V> extends Parent<K,V> { 
    @Override 
    public void f(K key, V value) {} 
} 

Child<String, LinkedList<String>> child = new Child<String, LinkedList<String>>(); 
child.f("key", new LinkedList<String>()); 

在這裏你有一個你已經定義爲接受LinkedList但不是所有Child'ren都必須接受LinkedList的孩子。

+0

問題是我不想將一個LinkedList傳遞給f,我想傳遞一個對象,我可能會將它放入列表中。至少這是我的意圖。我使它成爲一個LinkedList,因爲它可以在我的應用程序中執行,我可能需要創建新的。 – delmet 2010-12-16 21:56:25

+0

然後它不能是一個覆蓋。它必須是兩種不同的方法。對於任何K和V,父母的任何孩子都必須接受V作爲f的第二個參數。 – Dan 2010-12-16 22:03:45

+0

我明白了。謝謝你的幫助。儘管如此,這會消除多態性,所以我將不得不尋找更優雅的解決方案。 – delmet 2010-12-16 22:07:18