Klasse soll sich selbst returnieren mit entsprechendem Typ.

Status
Nicht offen für weitere Antworten.

-frank

Bekanntes Mitglied
angenommen ich habe sehr viele klassen, die alle die Klasse A extenden und alle eine Methode bieten sollen, die das Objekt selbst zurückgibt (warum auch immer...), wobei der return-type der entsprechende untertyp sein soll, also nicht A, sondern zb ExtendedA. ist es mit generics (oder sonst wie) möglich, diese methode in der abstrakten klasse A zu implementieren und nicht in unzähligen subklassen?

mein ansatz wäre gewesen:
Code:
public abstract class A<T extends A<T>> {
    T getA() {
        return this;
    }
}

dies funktioniert nicht. ich kann die methode abstrakt machen und somit erzwingen, dass sie jede subklasse implementiert, aber so wie oben bekomme ich einen "cannot convert from A<T> to T" error. (wobei ich schon verstehe, warum es nicht geht, aber nicht wie es stattdessen ginge bzw. ob überhaupt)
 
S

SlaterB

Gast
weil this nunmal A ist und nicht T?!

Code:
public abstract class A<T extends A<T>>
{
    A<T> getA()
    {
        return this;
    }
}

edit: ok, ich sehe worauf du hinauswillst, kann dir dazu aber keine Lösung nennen

edit:
oder doch?

Code:
public abstract class A<T extends A<T>>
{
    T getA()
    {
        return (T) this;
    }
    public static void main(String[] args)
    {
        B b = new B();
        
        B c = b.getA();
    }
}


class B extends A[B] {
    
}
 

-frank

Bekanntes Mitglied
SlaterB hat gesagt.:
weil this nunmal A ist und nicht T?!

ja, mir ist schon klar, dass es so nicht gehen kann, weil T ein anderes A sein kann als A. was ich erreichen wollte, ist folgendes:

klasse A1 hat eine Methode
Code:
public A1 getA() {
    return this;
}

klasse A2 hat eine Methode
Code:
public A2 getA() {
    return this;
}

..

usw.
ich wollte, dass A1 A erweitert und den eigenen Typ übergibt, also A1 extends A<A1> und dafür soll die getA() Methode gleich in A implementiert werden. kann ich das so bzw. so ähnlich erreichen?

edit: (erst jetzt das zweite posting gelesen)
durch all die versuce mit generics hab ich schon ganz die guten alten casts vergessen ;)
--> mit diesem einen (unsicheren) cast gehts also, danke! ohne cast bzw. ohne unsicheren cast gehts aber nicht, oder?
 
G

Guest

Gast
Code:
interface IA<T extends IA<T>>
{
   IA<T> getA();   
}

abstract class A<T extends A<T>> implements IA<T>
{ 
   public IA<T> getA()
   {
      return this;
   }
}

class B extends A[B]
{
}
:roll: :bahnhof:
 

Kim Stebel

Bekanntes Mitglied
angenommen ich habe sehr viele klassen, die alle die Klasse A extenden

@ SlaterB:
Das ist bei deinem Vorschlag nicht der Fall. B extends A, C extends A<C> etc...aber es gibt keine Klasse, von der sowohl B als auch C erben. Insbesondere erben sie nicht von A<Object>. Oder hat frank seine Frage falsch formuliert und du hast sie zufällig so falsch verstanden, wie er sie ursprünglich meinte? ;)
 
S

SlaterB

Gast
häh, von B und C erben? ne, da verstehe mindestens ich dich nicht,
wer wen falsch, das weiß ich nicht ;)
 

Kim Stebel

Bekanntes Mitglied
häh, von B und C erben?

umgekehrt! es gibt keine Klasse, _von der_ B und C erben, was frank ja wollte.(zumindest so wie er das formuliert hat.) A sollte ja die Klasse sein von der die vielen anderen Klassen B, C.....Z erben.
 
S

SlaterB

Gast
also B in meinem Beispiel erbt offensichtlich von A, warum nicht auch eine andere Klasse C?
 
S

SlaterB

Gast
so meinst du das,
na ist ja nicht weiter schlimm,
wenn A irgendwelche gemeinsame Funktionalität enthält, könnte man die ja noch in einer Oberklasse von A zugägnlich machen,
und A selber kann man ohne generischen Parameter eh nicht nutzen
 

-frank

Bekanntes Mitglied
SlaterB hat gesagt.:
-frank hat gesagt.:
ohne cast bzw. ohne unsicheren cast gehts aber nicht, oder?
Ansprüche sind das.., bin froh, überhaupt den Cast gefunden zu haben ;)

*gg*
ist jetzt mehr schon ne frage rein aus interesse. mir tut der cast an der einen stelle absolut nicht weh, aber mich hätts eben interessiert, obs ohne geht.

@gast:
ich bin jetzt selbst schon etwas verwirrt, aber in deinem beispiel bekomme ich doch ein IA<T>.

Code:
B b = .. // irgend ein B
B obj1 = b.getA(); // geht nicht (ohne cast)
IA[B] obj2 = b.getA(); // geht.

das heißt, ich erreiche so nicht (ganz), was ich wollte. oder seh ich das falsch?
 
G

Guest

Gast
-frank hat gesagt.:
...
@gast:
ich bin jetzt selbst schon etwas verwirrt, aber in deinem beispiel bekomme ich doch ein IA<T>.

Code:
B b = .. // irgend ein B
B obj1 = b.getA(); // geht nicht (ohne cast)
IA[B] obj2 = b.getA(); // geht.

das heißt, ich erreiche so nicht (ganz), was ich wollte. oder seh ich das falsch?
Ähmmm ja. ;)

Noch eine Variante
Code:
interface IA<T extends IA<?>> 
{ 
   T getA();    
} 

abstract class A<T extends IA<?>> implements IA<A<T>> 
{ 
   public A<T> getA() 
   { 
      return this; 
   } 
} 

class B<T extends IA<?>> extends A<B<T>> 
{ 
   public B<T> getA() 
   { 
      return this; 
   } 
}


B<IA<?>> b = new B<IA<?>>();
B<IA<?>> c = b.getA();

Wenn du sowas machen musst, dann würde ich das Design überdenken.
 

-frank

Bekanntes Mitglied
öhm, ja, eh... also auf den ersten blick blick ich da nicht mehr durch. werds mir morgen nochmal ansehen ;)
... was und zu dieser aussage führt:

Anonymous hat gesagt.:
Wenn du sowas machen musst, dann würde ich das Design überdenken.

... womit du wohl recht hast! so wärs auf jeden fall schon zu kompliziert.

was ich erreichen wollte:
angenommen ich habe ein interface Paintable. alle klassen, die paintable sind, implementieren die Methode getPaintData(). da es aber verschiedene PaintDatas gibt (zb DogPaintData, CatPaintData, etc.) bekommt Paintable den generischen parameter <T extends PaintData>. somit bietet jedes Paintable-Object die getPaintable()-Methode mit dem richtigen Returnparameter an. soweit so gut. was ich nun noch wollte, ist, dass PaintData-Objekte selbst auch Paintable implementieren (was ja in diesem fall IMO durchaus sinn machen würde). sie müssten nur sich selbst returnieren.
so bin ich auf das problem gestoßen. wobei es mich jetzt auch einfach interessiert, ob und wie man es lösen könnte (egal wie kompliziert). im endeffekt werde ich aber wohl kein generic-monster konstruieren, wenns dadurch zu komplizert wird. aber ich habe auch das gefühl, dass ich bei solchen spielerein durchaus auch was lerne, von daher mag ich solche spielereien. gerade weil ich generics lange zeit aus dem weg gegangen bin.
 
G

Guest

Gast
Das wäre dann sowas dieser Art.
Code:
interface Paintable<TPaintData extends PaintData>
{
   TPaintData getPaintData();
}

interface PaintData extends Paintable<PaintData>
{
   void foo();
}

abstract class AbstractPaintable<TPaintData extends PaintData> implements Paintable<TPaintData>
{
}

class DogPaintable extends AbstractPaintable<DogPaintData>
{
   public DogPaintData getPaintData()
   {
      return ...;
   }
}

class DogPaintData implements PaintData
{
   public DogPaintData getPaintData()
   {
      return this;
   }

// oder auch
//   public PaintData getPaintData()
//   {
//      return this;
//   }
   
   public void foo()
   {
   }
}
 

-frank

Bekanntes Mitglied
Anonymous hat gesagt.:
Das wäre dann sowas dieser Art

jein. ich wollte die Methode eben in AbstractPaintable bzw. PaintData haben und nicht in DogPaintable bzw. DogPaintData. durch die übergabe des typs mittels generics funkt das für AbstractPaintable auch wunderbar, bei PaintData ist aber eben ein cast nötig (was ja nicht so schlimm) oder aber eben so wie in deinem beispiel, dass alle subklassen die methode selbst implementieren. in letzterem fall gibts halt viel code redundanzen (besonders wenn man sich vorstellt, dass es noch ein paar mehr solche methoden gibt, wo die klasse ihre typ kennen sollte)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
perlenfischer1984 Lombok Builder soll andere Klasse bauen Allgemeine Java-Themen 4
L Klassen Konstruktor soll Objekt anderer Klasse erzeugen Allgemeine Java-Themen 2
C Abstrakte Klasse soll Methode aus Unterklasse aufrufen Allgemeine Java-Themen 3
B Thread soll auf Event warten, dann Daten an Klasse senden Allgemeine Java-Themen 2
T Klasse soll Object sein->um in JTabbedPane einzufügen Allgemeine Java-Themen 2
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
torresbig Klasse mit extends Calendar über Methoden ändern (Hirnblockade) Allgemeine Java-Themen 7
A Zweite Service Klasse beim Kompilieren Allgemeine Java-Themen 6
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
Atten007 Java-Klasse auf macOS entpacken? Allgemeine Java-Themen 2
M Klasse durch Klassen Aufteilung verbessern, aber wo? Allgemeine Java-Themen 1
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
EinNickname9 Best Practice Singleton und Singleton mit Instanz zu anderer Klasse -Pattern Allgemeine Java-Themen 30
Y ImagePanel von anderer Klasse in eine MainFrame Klasse hinzufügen. Allgemeine Java-Themen 1
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
missy72 Klassen Eigene Klasse MessageWindow ähnlich der Alert Klasse Allgemeine Java-Themen 2
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
kanywayne Java programmieren: Polynom Klasse Allgemeine Java-Themen 4
L Die abzuleitende Klasse als Parameter übergeben Allgemeine Java-Themen 4
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
C Klasse mit Mockito simulieren Allgemeine Java-Themen 9
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
Thallius Key/Value Table in Klasse einlesen Allgemeine Java-Themen 14
S static in Interface und Klasse Allgemeine Java-Themen 2
W Was genau sind IOTools? Kann ich stattdessen nicht die Scanner Klasse verwenden? Allgemeine Java-Themen 3
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
D javassist API Klasse in MethodCall ermitteln Allgemeine Java-Themen 8
kodela Klasse mit "gezipten" Daten Allgemeine Java-Themen 6
J Builder Klasse mit Lombok bauen Allgemeine Java-Themen 2
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
M [SOAP] - Klasse aus WSDL ausschließen Allgemeine Java-Themen 2
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2
X Klassen Klasse BreakIterator Allgemeine Java-Themen 6
R Arraylist in andere Klasse leiten und bearbeiten Allgemeine Java-Themen 10
kodela Klassen Klasse "vergisst" ihre Daten Allgemeine Java-Themen 2
pkm Kann eine ServerSocket-Klasse nicht stateful sein? Allgemeine Java-Themen 4
E Socket Dynamische Klasse von ObjectOutputStream lesen. Allgemeine Java-Themen 8
M Matcher-Klasse findet match nicht Allgemeine Java-Themen 6
cool_brivk24 Variablen abfragen von Boolean von anderer Klasse Allgemeine Java-Themen 12
S Seltsames Ergebnis mit Date-Klasse Allgemeine Java-Themen 6
J int Werte in einer anderen Klasse in Arrays speichern Allgemeine Java-Themen 3
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
Neoline Klassen Singleton Klasse buchmanager Allgemeine Java-Themen 19
M Kapselung Modellierung von Intervallen: Klasse Interval Allgemeine Java-Themen 4
B Übernommene Variablen(werte) aus der Main-Klasse ändern? Allgemeine Java-Themen 9
ReinerCoder Klasse kann nicht public deklariert werden Allgemeine Java-Themen 2
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
J IndexOutOfBoundsException bei der Nutzung der Klasse Message von mime4j Allgemeine Java-Themen 5
P Array einer abstrakten Klasse Allgemeine Java-Themen 4
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
kodela Dynamisches Array in einer Klasse Allgemeine Java-Themen 5
M Was geschieht mit Java-Klasse, die aus ArrayList entfernt wird? Allgemeine Java-Themen 10
perlenfischer1984 Mit Lombok Builder Felder in Super Klasse füllen Allgemeine Java-Themen 12
T String aus While Schleife für ganze Klasse sichtbar machen Allgemeine Java-Themen 5
K Best Practice Auf die Klasse zugreifen im erzeugten ActionListener Allgemeine Java-Themen 2
K Mit Button neue Klasse öffnen Allgemeine Java-Themen 9
J Reflection mit Klasse und Subklasse Allgemeine Java-Themen 11
C Classpath Neue Klasse über einen Button ausführen Allgemeine Java-Themen 3
magdaStone Logikproblem Umschalten von booleans in anderer Klasse Allgemeine Java-Themen 7
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4
A Java Klasse auf Tomcat während der Laufzeit austauschen Allgemeine Java-Themen 1
C Abstrakte Klasse, lokale Variable-Problem Allgemeine Java-Themen 1
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
Messoras Klassen Sämtliche Variablen einer Klasse übernehmen Allgemeine Java-Themen 6
H Methoden Methode 'updateItem' der Klasse 'TreeCell' Allgemeine Java-Themen 3
B Animierte Klasse schreiben - Wie? Allgemeine Java-Themen 9
M Klassen Eine Klasse in mehreren Klassen einbinden Allgemeine Java-Themen 11
N Methoden Methoden einer Klasse auf Grundlage eines Strings aufrufen Allgemeine Java-Themen 6
AssELAss Log4j Logging Ausgabe für jede Klasse in seperates File Allgemeine Java-Themen 2
L Eclipse JavaFX Klasse starten programmatisch Allgemeine Java-Themen 1
F Try/catch über ganze Klasse Allgemeine Java-Themen 9
L Von ArrayList abgeleitete Klasse nur mit bestimmten Objekten füllen Allgemeine Java-Themen 1
so_ein_Komischer Erste Schritte java Math Klasse finden? Allgemeine Java-Themen 2
J beans.instantiate(): Klasse kann nicht instanziiert werden Allgemeine Java-Themen 2
I Interface Interface / Klasse - wieso Abstract? Allgemeine Java-Themen 13
R Abstrakte Basisklasse und instanzierte Objekte der abgeleiteten Klasse als Basisklasse übergeben Allgemeine Java-Themen 2
F Methodenaufruf mit abgeleiteter Klasse als Arg... Allgemeine Java-Themen 10
M Klasse in separaten Thread ausführen.Wie genau? Allgemeine Java-Themen 2
A Best Practice Unterschied zwischen einer sauberen Dependency Injection und einer statischen Klasse Allgemeine Java-Themen 5
F Methoden in der Enumeration Klasse Allgemeine Java-Themen 1
S Die Initialisierung von Feldern in ableitender Klasse erzwingen..? Allgemeine Java-Themen 16
S Mit Generics Klasse erstellen die selbst T erweitert..? Allgemeine Java-Themen 4
M Variable außerhalb Klasse definierbar? Allgemeine Java-Themen 2
F Abstrakte Klasse in "For each" Schleife Allgemeine Java-Themen 1
F Enums als innere Klasse sinnvoll? Allgemeine Java-Themen 3
C Klassen Problem mit Funktion einer Generischen Klasse die ein Interface implementiert Allgemeine Java-Themen 0
K Problem: Java-Klasse mit mehreren Threads als eigenen Prozess starten Allgemeine Java-Themen 3
N Automatisches einfügen einer selbst generierten ID in Klasse mit Annotation Allgemeine Java-Themen 8
F Klassen Klasse bei Button klick öffnen Allgemeine Java-Themen 11
F OOP Datenbank-Klasse überall verfübar Allgemeine Java-Themen 2
E KeyCode in anderer Klasse speichern Allgemeine Java-Themen 2
B Klassen Eigene Klasse als Array benutzen Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben