Auf Thema antworten

Servus,


irgendwie bin ich auf ein Konstrukt gestoßen, das ich nicht ganz verstehe. Es geht um Generics, die habe ich vorher selten aktiv verwendet und hab jetzt einen Fall, in dem es durchaus Sinn macht. Allerdings stoße ich dabei an ne Grenze, die ich nicht ganz verstehe. Im Folgenden erläutere ich mal anhand eines Beispiels, wo mein Problem liegt.


Zu Beginn habe ich eine abstrakte Klasse definiert, die ich für alle späteren Implementierungen benutzen möchte. Das sieht so aus:


[code=Java]public abstract class Abstract<T extends Type> {

    public void doSomethingWith(T object) {

        System.out.println(object);

    }

}

[/code]


Dabei ist [code]Type[/code] selbst ein Interface, da es eben auch verschiedene Typen geben kann. In diesem Fall ist es nicht wichtig, was dieses Interface wirklich bereitstellt, deswegen sieht es für das Beispiel so aus:


[code=Java]public interface Type {

}[/code]


Für die verschiedenen Typen erstelle ich Enums, die dann eben Parameter verwalten. Das sieht so aus:


[code=Java]public enum Type1 implements Type {

    A, B, C;

}

[/code]


Und die Implementierung selbst schaut folgendermaßen aus:


[code=Java]public class Implementation1 extends Abstract<Type1> {

}[/code]


Dass hier auch nichts weiter geschieht, ist erstmal egal, es geht nur darum, dass die vererbte Methode eben nicht [code]Type[/code], sondern wirklich [code]Type1[/code] erwartet! Ginge es beispielsweise um Getter und Setter, dann könnte ich sicherstellen, dass hier nur gewollte, konkrete Subtypen des allgemeinen Interfaces verwendet werden.


Jetzt wird es interessant. An einer anderen Stelle möchte ich nun ein Objekt erzeugen, das auf jeden Fall vom Typ [code]Abstract[/code] ist. Ob es jetzt [code]Implementation1[/code] oder [code]Implementation2[/code] ist, kann ich nicht sagen, ist mir aber auch relativ egal. Sieht dann in etwa so aus:


[code=Java]public class Test {

    public static void main(String[] args) {

        Abstract<?> var = giveMeImplementationForAbstract();

        Type test = Type1.A;

        var.doSomethingWith(test);

    }

   

    public static Abstract<?> giveMeImplementationForAbstract(){

        return new Implementation1();

    }

}[/code]


Aber Zeile 5 verbietet er mir:



Macht auch keinen Unterschied, wenn ich statt [code]<?>[/code] sowas wie [code]<? extends Type>[/code] schreibe. Und wo genau ist das Problem?


Nun, so richtig verstehe ich die Ursache des Fehlers nicht. Deswegen frage ich euch. Irgendwo muss ich einen Denkfehler haben. Denn eigentlich würde ich erwarten, dass diese Methode ein Argument vom Typ [code]Type[/code] annehmen würde. Tut sie aber nicht. Was genau soll denn da stehen? Kennt jemand einen eleganten Weg das anders zu lösen?



Oben