2012-06-28 16 views
6

Mam pewne problemy z metodą posiadającą wpisany parametr listy, dziedziczony z innej (wpisanej) klasy.Metoda z wpisaną listą i dziedziczeniem

Trzymajmy go prosta:

public class B<T> { 
    public void test(List<Integer> i) { 
    } 
} 

Klasa B ma bezużyteczną rodzajowego T, oraz test() ma Listę Integer.

Teraz jeśli mam zrobić:

public class A extends B { 
    // don't compile 
    @Override 
    public void test(List<Integer> i) { 
    } 
} 

dostaję "Test metodą (List) typu A należy zastąpić lub wdraża metodę supertypem" błąd, że nie powinno się zdarzyć.

Ale usunięcie typu listy działa ... chociaż nie zależy od klasy ogólnej.

public class A extends B { 
    // compile 
    @Override 
    public void test(List i) { 

A także definiowanie bezużyteczne generic poniżej, aby użyć wpisanie z klawiatury

public class A extends B<String> { 
    // compile 
    @Override 
    public void test(List<Integer> i) { 

więc mam pojęcia, rodzajowy B powinny mieć żadnego wpływu na rodzaj testu() listy. Czy ktoś ma pojęcie o tym, co się dzieje?

Dzięki

+0

Wierzę, że twoja odpowiedź leży [tutaj] (http://stackoverflow.com/a/502770/248082). – nobeh

+0

Konwencjonalnie [kapitał V] 'Void' jest używany do ogólnych parametrów, których nie chcesz używać. Na przykład przy użyciu 'java.security.PreivilegedAction' bez zwracania wartości (return' null' - jest to jedyne poprawne odniesienie 'Void'). –

Odpowiedz

8

Rozszerzasz surowy typ B, a nie ogólny. Surowy nie ma efektywnie metody test(List<Integer> i), ale metody .

Po przełączeniu na typy surowe, wszystkie generatory zostaną zastąpione przez nieprzetworzone, niezależnie od tego, czy ich typ został wypełniony czy nie.

Aby zrobić to poprawnie, wykonaj

public class A<T> extends B<T> 

Pozwoli to wykorzystać ogólny typ B<T>, który zawiera metodę, którą chcesz zastąpić.

+0

Dzięki. Niezupełnie logiczne, ponieważ nie używamy T, ale generics java ma kilka wad projektowych, z którymi musimy się uporać. – PomPom

1

Po usunięciu użyć klasy bez leków generycznych (i używać go na surowo), wszystkie leki generyczne z metod klasy są zapomniane.

Z tego powodu, gdy informuje się rodzajowy typ w drugim przypadku, uruchamia się.

to:

class T<G> { 
    public void test(G g); 
} 

w tym przypadku:

class A extends T { 
} 

będzie wyglądać następująco:

class T { 
    public void test(Object g); 
} 

To było puzzle java prezentowane w Google IO 2011 można zobaczyć wideo here

+0

Prawdziwym problemem jest to, że nie używałem G, ale konkretnej klasy. W każdym razie dostałem odpowiedź – PomPom

+0

Używałeś surowej klasy. –

Powiązane problemy