2010-06-22 18 views
9

Mam następujące klasy abstrakcyjne:rodzajowych Java i dziedziczenie

public abstract class AbSuperClass1<K,S> { 
    //class definition 
} 

oraz:

public abstract class AbSuperClass2<K,S> { 
    public abstract <Q extends AbSuperClass1<K,S>> void method(Q arg); 
    ... 
} 

Mam następnie dwa konkretne implementacje

public class Concrete1 extends AbSuperClass<String, String>{ 
    //class definition 
} 

oraz:

public class Concrete2 extends AbSuperClass2<String, String>{ 
    public void method(Concrete1 arg){ 
     //method definition 
    } 
} 

Nie zostanie to jednak skompilowane, ponieważ Concrete1 nie jest uznawane za poprawny typ dla argumentu metody w Concrete2, ale o ile widzę Concrete1 ma poprawny typ, ponieważ rozszerza AbSuperClass1.

Gdzie się mylę?

+1

Jeśli to możliwe, sugeruję użycie Eclipse jako środowiska do napisania kodu Java. Eclipse pokazałby dokładnie, co było nie tak i dostarczył menu rozwijane, aby dodać brakującą funkcję jednym kliknięciem myszy. Ten rodzaj zdolności może znacznie przyspieszyć twoją krzywą uczenia się i czas rozwoju. –

+2

'public abstract > void method (Q arg);' jest odpowiednikiem 'publicznej abstrakcyjnej metody void (AbSuperClass1 arg);'. –

Odpowiedz

3

Eclipse zaproponowała dodanie tej metody:

@Override 
public <Q extends AbSuperClass1<String, String>> void method(Q arg) { 
    // TODO Auto-generated method stub 

} 

Inną rzeczą, jaką możesz zrobić, to dodać ten parametr typu do klasy:

abstract class AbSuperClass2<K,S, Q extends AbSuperClass1<K,S>> { 
    public abstract void method(Q arg); 
} 

i

class Concrete2 extends AbSuperClass2<String, String, Concrete1> { 
    public void method(Concrete1 arg) { 
     //method definition 
    } 
} 
5

Rozważmy ten program :

public class OtherConcrete extends AbSuperClass<String, String> {} 

AbSuperClass2<String, String> x = new Concrete2(); 
x.method(new OtherConcrete()); 

Czego można się spodziewać? Zastąpiłeś metodę dostarczania implementacji dla jednego określonego podtypu z AbSuperClass<String, String> - ale nie dostarczyłeś implementacji, która poradziłaby sobie z dowolnymAbSuperClass<String, String>, co jest wymagane.

Ciężko zasugerować konkretny sposób działania, nie znając szczegółów sytuacji. Sugestia Bozho o dodaniu kolejnego parametru - pozwalającego ci na bardziej szczegółową deklarację method - jest dobra ... ale cała sprawa staje się bardzo skomplikowana. Jeśli uda Ci się wypracować jakikolwiek sposób, by zmniejszyć ilość generycznego funkcyjności, twoi opiekunowie kodu prawdopodobnie dziękują za to.