java-forum.org - Java programmieren aus Leidenschaft
Java 6 Einstieg und professioneller Einsatz
Alter Preis: 34,90 EUR
Jetzt: 0,00 EUR

zzgl. Versandkosten

Zurück   java-forum.org - Java programmieren aus Leidenschaft > Java - Programmierung > Allgemeine Java-Themen

Allgemeine Java-Themen Allgemeine Themen, die nicht in andere Fachforen und nicht zu den Java Basics passen

Thema geschlossen    
Themen-Optionen Thema durchsuchen Ansicht
Alt 17.08.2007, 18:51   #1 (permalink)
Stammbenutzer
Kilobyte
 
Registriert seit: 08.06.2006
Fachbeiträge: 223
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Standard Klasse soll sich selbst returnieren mit entsprechendem Typ.

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)
-frank ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 17.08.2007, 19:00   #2 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von SlaterB
 
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: 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] {
    
}
__________________
Hansa wird Meister.
SlaterB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 17.08.2007, 19:07   #3 (permalink)
Stammbenutzer
Kilobyte
Themenstarter
 
Registriert seit: 08.06.2006
Fachbeiträge: 223
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Zitat: SlaterB
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?
-frank ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 17.08.2007, 19:11   #4 (permalink)
Nicht angemeldet
 
Fachbeiträge: n/a
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]
{
}
 
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 17.08.2007, 19:18   #5 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von SlaterB
 
Registriert seit: 13.11.2005
Fachbeiträge: 31.658
Abgegebene Danke: 0
Erhielt 2.568 Danke für 2.529 Beiträge
Zitat: -frank
ohne cast bzw. ohne unsicheren cast gehts aber nicht, oder?
Ansprüche sind das.., bin froh, überhaupt den Cast gefunden zu haben
__________________
Hansa wird Meister.
SlaterB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 17.08.2007, 19:36   #6 (permalink)
Stammbenutzer
Viertel Megabyte
 
Registriert seit: 21.07.2007
Fachbeiträge: 401
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Zitat:
angenommen ich habe sehr viele klassen, die alle die Klasse A extenden
@ SlaterB:
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
Kim Stebel ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 17.08.2007, 19:38   #7 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von SlaterB
 
Registriert seit: 13.11.2005
Fachbeiträge: 31.658
Abgegebene Danke: 0
Erhielt 2.568 Danke für 2.529 Beiträge
häh, von B und C erben? ne, da verstehe mindestens ich dich nicht,
wer wen falsch, das weiß ich nicht
__________________
Hansa wird Meister.
SlaterB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 17.08.2007, 19:51   #8 (permalink)
Stammbenutzer
Viertel Megabyte
 
Registriert seit: 21.07.2007
Fachbeiträge: 401
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Zitat:
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.
__________________
most people don't even think inside the box
Kim Stebel ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 18.08.2007, 07:03   #9 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von SlaterB
 
Registriert seit: 13.11.2005
Fachbeiträge: 31.658
Abgegebene Danke: 0
Erhielt 2.568 Danke für 2.529 Beiträge
also B in meinem Beispiel erbt offensichtlich von A, warum nicht auch eine andere Klasse C?
__________________
Hansa wird Meister.
SlaterB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 18.08.2007, 07:08   #10 (permalink)
Stammbenutzer
Viertel Megabyte
 
Registriert seit: 21.07.2007
Fachbeiträge: 401
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Zitat:
also B in meinem Beispiel erbt offensichtlich von A
B erbt von A[B], nicht von A.
Und C würde dann von A<C> erben und nicht von A.
__________________
most people don't even think inside the box
Kim Stebel ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 18.08.2007, 07:12   #11 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von SlaterB
 
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.
SlaterB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 18.08.2007, 08:49   #12 (permalink)
Stammbenutzer
Kilobyte
Themenstarter
 
Registriert seit: 08.06.2006
Fachbeiträge: 223
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Zitat: SlaterB
Zitat: -frank
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?
-frank ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 18.08.2007, 15:55   #13 (permalink)
Nicht angemeldet
 
Fachbeiträge: n/a
Zitat: -frank
...
@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.
 
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 18.08.2007, 16:24   #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:

Zitat: Anonymous
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.
-frank ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 18.08.2007, 16:50   #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()
   {
   }
}
 
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 18.08.2007, 17:17   #16 (permalink)
Stammbenutzer
Kilobyte
Themenstarter
 
Registriert seit: 08.06.2006
Fachbeiträge: 223
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Zitat: Anonymous
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)
-frank ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Thema geschlossen    

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
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

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:40 Uhr.


Powered by vBulletin® Version 3.8.6 (Deutsch)
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.2
Thanks for Smilies by smilies.4-user.de