Generic extends Generic

Network

Top Contributor
Hi,

ich habe ein kleines logisches Problem mit Generics.
Wie löse ich folgende Problemstellung:
Java:
public class AbstractClass<A extends AbstractClass> implements AbstractInterface<A> {
     public A getAnotherClass() {
          return new AnotherClass<A>();
     }
}
In diesem Beispiel muss die Klasse welche selbst der Vererber des generischen Typ ist wissen, welcher generische Typ verwendet wird um die entsprechenden Methoden bereitzustellen.
Der Compiler gibt zurecht die Fehlermeldung, dass
Java:
A extends AbstractClass
wiederum eine generische Typzuweisung benötigt. Das ist natürlich nicht möglich denn das würde dann so ausarten: <A<A<A<A<A<A<A ... etc....

Übersehe ich hier irgendetwas oder ist diese Form der Verwendung von Generics schlicht nicht möglich?

Vielen Dank
Gruß
Network
 
S

SlaterB

Gast
wenn du in getAnotherClass() ein Objekt AnotherClass<A> erzeugst, wieso gibst du dann nicht AnotherClass<A> zurück, sondern A?
weil AbstractInterface das so vorgibt?
mit 'A extends AbstractClass' ist überhaupt nicht festgelegt, dass A etwas mit AnotherClass zu tun hat,
das ist bisher alles reichlich lose

wie es zu <A<A<A<A<A<A<A kommt sehe ich vorerst nicht

ein Objekt der Klasse A zu erzeugen ist wie immer recht schwierig,
ein bekanntes AnotherClass wäre dazu hilfreich

eine kompilerfehlerfreie Kombination ist:
Java:
class AbstractClass<A extends AbstractClass>  implements AbstractInterface<A> {
    public AnotherClass<A> getAnotherClass()  {
        return new AnotherClass<A>();
    }
}

interface AbstractInterface<T> {
    public AnotherClass<T> getAnotherClass();
}

class AnotherClass<T> { }
 

Marco13

Top Contributor
Vielleicht ging es um die Warning, die bei
class AbstractClass<A extends AbstractClass> implements AbstractInterface<A> {
vs.
class AbstractClass<A extends AbstractClass<A>> implements AbstractInterface<A> {
entsteht?
 

Network

Top Contributor
Vielleicht ging es um die Warning, die bei
class AbstractClass<A extends AbstractClass> implements AbstractInterface<A> {
vs.
class AbstractClass<A extends AbstractClass<A>> implements AbstractInterface<A> {
entsteht?

Ganz genau und zufällig habe ich das Thema nochmals in einem Buch gefunden, dass man es genauso schreiben muss:
Java:
class AbstractClass<A extends AbstractClass<A>>
Und warum. Ein sehr komisches Konstrukt wie ich "fande".
Dabei hat mir der Compiler aber nicht gerade geholfen gehabt, er hatte sogar noch mehr Verwirrung dazu gegegeben, weil er 'anfehlerte' das AbstractClass nicht von AbstractClass extended und damit kein gültiger Typ A ist.
Was zwar richtig ist aber in jedem anderen Zusammenhang akzeptiert werden würde, deshalb erschienen mir eure Beiden genannte Lösung nicht schlüssig.

Ich bedanke mich
Gruß
Net
 
S

SlaterB

Gast
welche Fehlermeldung ist das genau?
hängt vielleicht auch mit den weiteren Konstrukten, Bedingungen durch das Interface, zusammen,
bei mir gibts eher nur eine allgemeine 'raw type'-warning

AbstractClass<A extends AbstractClass>
oder
AbstractClass<A extends AbstractClass<A>>
macht schon ein wenig inhaltlichen Unterschied, soll die Parameter Klasse direkt eine 'eigene AbstractClass' sein oder nicht?

Java:
class C extends AbstractClass { }
class B extends AbstractClass<C> { } // *
class D extends AbstractClass<D> { }
class E extends D { }
class F extends AbstractClass<D> { }
class G extends AbstractClass<E> { } // *
mit 'AbstractClass<A extends AbstractClass<A>>' gibt es in zwei *-Fällen Probleme,
der erste nur allgemein weil ein generischer Typ erwartet wird,
der zweite ist schon interessanter:
E ist zwar letztlich auch eine AbstractClass, aber keine 'eigene', keine AbstractClass<E>, sondern eine AbstractClass<D>
 

Marco13

Top Contributor
Hmja, diese Selbstreferentiellen Generics sind so eine Sache ... Bei "Comparable" sieht's so einfach aus, aber gelegentlich habe ich versucht, sie ernsthaft einzusetzen, und irgendwie landet man doch immer in der Hölle. Manchmal kann der getThis-Trick helfen, manchmal hilft es, wenn man den Typ "grobranularer" festlegt (also nicht die Typen der generics-Parameter festzulegen versucht, sondern des Typs selbst, der die Parameter hat), manchmal kann man mit statischen Typ-Capture-Helper-Methoden wie
Java:
static void <S, T extends S> helper(Type<S, T> type) { ... }
tricksen, aber kompliziert ist es immer...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Werte einer Generic LinkedList zusammenrechenen Allgemeine Java-Themen 14
Rakshan Generic reading of XML document from the root tag into an Collection Allgemeine Java-Themen 0
B In Java Methode mit generic input und output basteln? Allgemeine Java-Themen 4
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2
S Problem mit Generic bei unmodifiableCollection Allgemeine Java-Themen 4
Neumi5694 Methoden Generic: Rückgabetyp als Class-Parameter übergeben Allgemeine Java-Themen 3
Neumi5694 Datentypen Generic mit parameterlosem Konstructor Allgemeine Java-Themen 4
C Generic collections und static typing Allgemeine Java-Themen 4
K Generic class und Reflection Allgemeine Java-Themen 2
K Saubere Verwendung von Generic Types Allgemeine Java-Themen 7
T Generic Allgemeine Java-Themen 1
C Generic-Funktion nur bei bestimmten Typen erlauben Allgemeine Java-Themen 6
M Cannot create a generic array of T Allgemeine Java-Themen 5
TheWhiteShadow Generic Bug? Allgemeine Java-Themen 19
P Generic zur Laufzeit Allgemeine Java-Themen 4
X Generic muss zwei Klassen/Interfaces erfüllen Allgemeine Java-Themen 5
S Reflection und Generic Allgemeine Java-Themen 9
G Klasse eines Generic Allgemeine Java-Themen 6
J Generic von einer ArrayList/HashMap bekommen Allgemeine Java-Themen 7
G Generic merhfach Angabe Allgemeine Java-Themen 8
Dragonfire Generic Typ zur Laufzeit Allgemeine Java-Themen 9
N Casten durch generic vermeiden ?? Allgemeine Java-Themen 10
N generic reflection Allgemeine Java-Themen 5
thE_29 Generic Methoden die sich aufrufen wollen nicht immer Allgemeine Java-Themen 12
A Generic-Problem. was meint ihr dazu? Allgemeine Java-Themen 4
G unbekanntes Generic Allgemeine Java-Themen 12
K Bound mismatch: The generic method sort(List<T>) of ty Allgemeine Java-Themen 4
V ArrayList ist nicht generic!?? Oder bin ich blöd? Allgemeine Java-Themen 2
G [quote]the type HashMap is not generic; it cannot be paramet Allgemeine Java-Themen 4
C Generic Type ermitteln Allgemeine Java-Themen 3
H References to generic type Test.A<typ> should be param Allgemeine Java-Themen 5
byte Generic Type einer List zur Laufzeit rausfinden? Allgemeine Java-Themen 4
torresbig Klasse mit extends Calendar über Methoden ändern (Hirnblockade) Allgemeine Java-Themen 7
M OOP Design Pattern - "extends Observable implements Observer" Allgemeine Java-Themen 0
B public class JarFilter extends FileFilter « Falsch? Allgemeine Java-Themen 4
T SatelliteVector extends Vector3D - Fehler Allgemeine Java-Themen 6
Y extends myEnum Allgemeine Java-Themen 3
N class Task extends TimerTask ohne Blockieren Allgemeine Java-Themen 15
Y Reflection und "extends" Schlüsselwort Allgemeine Java-Themen 3
E extends array[] Allgemeine Java-Themen 8
N myclass extends blubber Allgemeine Java-Themen 2
M ist "public abstract class * extends" möglich? Allgemeine Java-Themen 2
S import vs. extends Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben