![]() |
|
|
|||||||
| Allgemeine Java-Themen Allgemeine Themen, die nicht in andere Fachforen und nicht zu den Java Basics passen |
|
|
|
Themen-Optionen | Thema durchsuchen | Ansicht |
| #1 (permalink) | |
|
Stammbenutzer
Kilobyte
Registriert seit: 08.06.2006
Fachbeiträge: 223
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
|
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;
}
}
|
|
|
| #2 (permalink) | |
|
Java-Forum Team
Moderator
Registriert seit: 13.11.2005
Fachbeiträge: 31.658
Abgegebene Danke: 0
Erhielt 2.568 Danke für 2.529 Beiträge
|
weil this nunmal A ist und nicht T?!
Code:
public abstract class A<T extends A<T>>
{
A<T> getA()
{
return this;
}
}
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] {
}
__________________
Hansa wird Meister. |
|
|
| #3 (permalink) | ||||||||||||||||
|
Stammbenutzer
Kilobyte
Themenstarter
Registriert seit: 08.06.2006
Fachbeiträge: 223
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
|
klasse A1 hat eine Methode Code:
public A1 getA() {
return this;
}
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? |
|||||||||||||||
|
|
||||||||||||||||
| #5 (permalink) | ||||||||||||||||
|
Java-Forum Team
Moderator
Registriert seit: 13.11.2005
Fachbeiträge: 31.658
Abgegebene Danke: 0
Erhielt 2.568 Danke für 2.529 Beiträge
|
__________________
Hansa wird Meister. |
|||||||||||||||
|
|
||||||||||||||||
| #6 (permalink) | ||||||||||||||||
|
Stammbenutzer
Viertel Megabyte
Registriert seit: 21.07.2007
Fachbeiträge: 401
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
|
Das ist bei deinem Vorschlag nicht der Fall. B extends A[B], 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?
__________________
most people don't even think inside the box |
|||||||||||||||
|
|
||||||||||||||||
| #8 (permalink) | ||||||||||||||||
|
Stammbenutzer
Viertel Megabyte
Registriert seit: 21.07.2007
Fachbeiträge: 401
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
|
__________________
most people don't even think inside the box |
|||||||||||||||
|
|
||||||||||||||||
| #10 (permalink) | ||||||||||||||||
|
Stammbenutzer
Viertel Megabyte
Registriert seit: 21.07.2007
Fachbeiträge: 401
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
|
Und C würde dann von A<C> erben und nicht von A.
__________________
most people don't even think inside the box |
|||||||||||||||
|
|
||||||||||||||||
| #11 (permalink) | |
|
Java-Forum Team
Moderator
Registriert seit: 13.11.2005
Fachbeiträge: 31.658
Abgegebene Danke: 0
Erhielt 2.568 Danke für 2.529 Beiträge
|
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
__________________
Hansa wird Meister. |
|
|
| #12 (permalink) | |||||||||||||||||||||||||||||||
|
Stammbenutzer
Kilobyte
Themenstarter
Registriert seit: 08.06.2006
Fachbeiträge: 223
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
|
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. |
||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||
| #13 (permalink) | ||||||||||||||||
|
Nicht angemeldet
Fachbeiträge: n/a
|
![]() 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();
|
|||||||||||||||
| #14 (permalink) | ||||||||||||||||
|
Stammbenutzer
Kilobyte
Themenstarter
Registriert seit: 08.06.2006
Fachbeiträge: 223
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
|
ö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:
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. |
|||||||||||||||
|
|
||||||||||||||||
| #15 (permalink) | |
|
Nicht angemeldet
Fachbeiträge: n/a
|
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()
{
}
}
|
| #16 (permalink) | ||||||||||||||||
|
Stammbenutzer
Kilobyte
Themenstarter
Registriert seit: 08.06.2006
Fachbeiträge: 223
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
|
|
|||||||||||||||
|
|
||||||||||||||||
|
| Themen-Optionen | Thema durchsuchen |
| Ansicht | |
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Thread soll sich selbst beenden | Die Fragende | Java Basics - Anfänger-Themen | 8 | 31.01.2007 15:02 |
| Objekt soll sich selbst löschen | bristtote | Java Basics - Anfänger-Themen | 25 | 07.07.2006 20:46 |
| SWT - Tree soll sich selbst breit machen | ich_wills_wissen | AWT, Swing, JavaFX & SWT | 1 | 31.03.2006 08:01 |
| HILFE - Popup soll sich selbst aktualisieren. | Aline | Für Verirrte - Fragen zu JavaScript | 3 | 13.10.2005 13:07 |
| Programm soll sich selbst kopieren | Allgemeine Java-Themen | 1 | 05.08.2005 15:32 | |
| Lesezeichen |
|
|