Generics und Comparable

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
hallo zusammen,
ich brauch ein Interface, das wie Comparable eine Methode compareTo enthält. Dies wird benötigt um Objekte von diesem Interface einfach über Collections.sort sortieren zu können.
Um einfach nur Objekte vergleichen zu können brauch ich kein extra-interface, da meine Klasse Comparable implementieren kann:

Code:
public class MyObject implements Comparable<MyObject> {
    public int compareTo(MyObject m) {

    }
}

Allerdings sollen meine Klassen auch eine weitere Methode implementieren, die z.B. ein Objekt zurückgeben können:

Code:
public class MyObject implements Comparable<MyObject> {
    public int compareTo(MyObject m) {

    }

    MyObject newObjectAfterOperation() {

    }
}

So gehts ja, aber ich dachte mir ich stelle ein Interface bereit, das von den Klassen implementiert wird:

Code:
public interface MyComparable<T extends MyComparable> extends Comparable<T> {
    int compareTo(final T obj);
    T newObjectAfterOperation();
}

So dass ich nachher schreiben kann:

Code:
public class MyObject implements MyComparable<MyObject> {
    public int compareTo(MyObject m) {

    }

    MyObject newObjectAfterOperation() {

    }
}

Wenn ich das wie angegeben mache meldet er keine Fehler. Wenn ich aber jetzt versuche eine Liste von Objekten anzulegen und versuche diese zu sortieren, meldet er boundmismatch.

Code:
        List<MyComparable<MyObject>> test = 
            new ArrayList<MyComparable<MyObject>>();
...
Collections.sort(test);

Ich kenn mich mit Generics nicht so aus, wollte aber zeigen das ich zumindest was versucht habe...

In der Liste sollen nur Objekte der gleichen Klasse sein, die jeweils MyComparable implementiert. Allerdings weiss ich vorher nicht welche konkrete Klasse verwendet wird, deswegen kann ich nicht einfach direkt MyObject sortieren, sondern verwende das Interface MyComparable.

Hoff. ist das Problem klar geworden. Danke im Voraus.
 
S

SlaterB

Gast
also
List<MyObject> test = new ArrayList<MyObject>();
geht,
List<MyComparable> test = new ArrayList<MyComparable>();
auch,
was willst du mehr, was reicht an diesen nicht?

warum MyComparable<MyObject> nicht geht, kann ich allerdings nicht sagen


nächstes Mal bitte die Fehlermeldung komplett + idealerweise ein Testprogramm,
warum soll sich das jeder selber zusammenschreiben?
(außer die, die das blind überblicken ;) )

Code:
public class MyObject
    implements MyComparable<MyObject>
{
    public int compareTo(MyObject m)
    {
        return 0;
    }

    public MyObject newObjectAfterOperation()
    {
        return null;
    }

    public static void main(String[] args)
    {
        List<MyObject> test = new ArrayList<MyObject>();
        test.add(new MyObject2());
        Collections.sort(test);
        System.out.println(test);
    }
}

class MyObject2
    extends MyObject
{

}

interface MyComparable<T extends MyComparable>
    extends Comparable<T>
{
    int compareTo(final T obj);

    T newObjectAfterOperation();
}
 
B

Beni

Gast
Es würde gehen, wenn du dein Interface anders schreibst:
Code:
interface MyComparable<T extends MyComparable<T>> extends Comparable<MyComparable<T>> {
... aber wenn du das Interface implementierst, wirst du sehen, dass die compareTo-Methode nicht mehr so schön ist. Das "sort" verlangt offenbar die Parameter auf einem Weg, der dafür sorgt, dass in der Liste nur ein Element-Typ ist.

Btw: die Generics deines originalen MyComparable-Interfaces sind noch nicht vollständig, so wäre es besser:
Code:
public interface MyComparable<T extends MyComparable<T>> extends Comparable<T> {...}
Überall wo "MyComparable" auftritt, sollte man seinen Parameter ausfüllen.
 
G

Gast

Gast
Ok, danke für eure Antworten.
SlaterB: Tut mir leid, das nächste Mal werde ich das noch hinzufügen.

Warum es nicht reicht? Ich will in der Liste nur jeweils objekte einer bestimmten Klasse, die MyComparable implementiert, allerdings weiss ich vorher nicht welche konkrete Klasse das ist, ich weiss nur das verschiedene Klassen das Interface implementieren.

Beni: Danke, werds mir nachher angucken, wenn ich wieder zu hause bin.
 
B

bygones

Gast
irgendwann musst du konkret sagen, welche typen in deiner liste sind....

d.h. wenn du die Liste instanzierst, musst du irgendwann den konkreten Typen angeben, oder du packst das ganze in eine generische Klasse die die Liste haelt....
 
G

Gast

Gast
Also, so siehts momentan aus:

Code:
public interface MyComparable<T extends MyComparable<T>> extends Comparable<T> {
    int compareTo(final T obj); 

    T newObjectAfterOperation(); 
}


Code:
public class MyObject implements MyComparable<MyObject>{
    public int compareTo(MyObject m) {
        return 0;
    }
    
    public MyObject newObjectAfterOperation() {
        return null;
    }
}


Code:
public class MyObject2 implements MyComparable<MyObject2>{
    public int compareTo(MyObject2 m) {
        return 0;
    }
    
    public MyObject2 newObjectAfterOperation() {
        return null;
    }
}


Code:
public class TestClass {
    public static void testMethod(MyComparable myComp) {
        List<MyComparable> list = new ArrayList<MyComparable>();
        
        for (int i = 0;i < 5; i++) {
            list.add(myComp.newObjectAfterOperation());
        }
        
        Collections.sort(list);
    }
    
    public static void main(String[] args) {
        MyComparable<MyObject2> m = new MyObject2();
        testMethod(m);        
    }
}

Ist das so richtig? dbac hat schon recht, irgendwo muss ich ein konkretes objekt erzeugen, das ist bei mir in der main. die methode testmethod bekommt ein Objekt vom Typ MyComparable, weiss aber nicht genau welche konkrete Klasse dahinter steckt (muss die methode auch nicht wissen).

Implementierung ist jetzt dummy, aber wollte wissen ob das jetzt so mit generics passt oder obs einfach nur syntakisch korrekt ist, semantisch aber falsch.
 
B

Beni

Gast
Ich würde den generischen Parameter von MyComparable nicht einfach so unterschlagen. Vielleicht sowas?
Code:
class TestClass {
    public static <M extends MyComparable<M>> void testMethod(M myComp) {
        List<M> list = new ArrayList<M>();
       
        for (int i = 0;i < 5; i++) {
            list.add(myComp.newObjectAfterOperation());
        }
       
        Collections.sort(list);
    }
   
    public static void main(String[] args) {
        // hier gibt es eine Veränderung!
        MyObject2 m = new MyObject2();
        testMethod(m);       
    }
}

[Edit]
Noch eine andere Variante, die ein bisschen näher beim Original ist:
Code:
class TestClass {
    public static <M extends MyComparable<M>> void testMethod(MyComparable<M> myComp) {
        List<M> list = new ArrayList<M>();
       
        for (int i = 0;i < 5; i++) {
            list.add(myComp.newObjectAfterOperation());
        }
       
        Collections.sort(list);
    }
   
    public static void main(String[] args) {
        MyComparable<MyObject2> m = new MyObject2();
        testMethod(m);       
    }
}
 
G

Gast

Gast
Ok danke. Noch etwas. Nehmen wir an die Testklasse hat ein Attribut vom Typ MyComparable. Dann müsste ich die Klasse doch auch mit Generics verwenden oder?
Also so etwas:

Code:
class TestClass<T extends MyComparable<T>> { 
private MyComparable<T> comparable;
Richtig?

Dann kann ich diesen Typ T aber nicht bei der statischen Methode verwenden. Dann muss ich bei der statischen Methode nach wie vor :

Code:
public static <T extends MyComparable<T>>

schreiben oder?
 
B

Beni

Gast
Zu 1: Richtig. Allenfalls reicht es "private T comparable" zu schreiben.

Zu 2: Generics kann man auch mit statischen Methoden zusammen verwenden. Die werden dort genau gleich wie angegeben, wie wenn man sie für normale Methoden verwenden möchte (nämlich direkt vor dem Rückgabetyp).

Da du scheinbar von Generics überflutet wirst, meine Gegenmittel:
- versuch mehr konkrete Typen zu verwenden
- lass die Generics in "geschützten Bereichen", also in dem Code den man von aussen nicht sieht und auch nicht direkt aufrufen kann, einfach weg.
 
G

Gast

Gast
Ok, kann Generics bei statischen Methoden auch "ganz normal verwenden". Allerdings kann ich nicht den Typ T, den ich bei der Klasse angebe, nicht in der statischen Methode angeben. Also so:


Code:
class TestClass<T extends MyComparable<T>> { 
private MyComparable<T> comparable; 

public static MyComparable<T>....

...
}

Ich kann natürlich bei der statischen Methode wieder T einschränken : <T extends ...>, aber ich hätte ja gerne genau den Typ T der auch in dem Attribut verwendet wird.

Danke für eure Hilfe. Ich finde das Thema teils noch etwas verwirrend..
 
G

Gast

Gast
Kann ich in dem Fall bei dem Attribut nicht den Typen T weglassen bzw. bei der Klasse?
Das Attribut kann von keiner externen Klasse direkt erfragt werden, wird aber intern benötigt, da auf dem Attribut best. Methoden aufgerufen werden.

Dann hätte ich:

Code:
class TestClass {
private MyComparable comparable;

public static <T extends MyComparable<T>> TestClass createTestClass(MyComparable<T>) {
...
}
}

Habs oben wahr. falsch ausgedrückt. Ich erzeug über eine statische (Factory) Methode Objekte der Klasse, da die Klasse lediglich einen privaten Konstruktor hat.

Das Attribut wird zur Berechnung anderer Attribute benötigt und kann nicht über get etc. erfragt werden.
 
G

Gast

Gast
Um nochmal auf das Thema zurückzukommen. Wäre es den Fall ok den typparameter beim attribut und der klasse wegzulassen, weil ich ja weiss das was "richtiges" von der factory-methode zurückkommt.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Problem mit Generics und Comparable Allgemeine Java-Themen 16
J Best Practice Generics mit Enum Allgemeine Java-Themen 3
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
Zeppi Cast Object in Generics Allgemeine Java-Themen 4
P Generics und Arrays Allgemeine Java-Themen 6
M Generics / Typen Allgemeine Java-Themen 1
Kirby.exe InsertionSort mit Generics Allgemeine Java-Themen 33
Kirby.exe Vererbung bei Generics Allgemeine Java-Themen 7
H Klarnamen etc... (von Wie Generics lernen?) Allgemeine Java-Themen 26
D Wie Generics lernen? Allgemeine Java-Themen 26
L Compiler-Fehler Generics beim Anhängen von Predicates Allgemeine Java-Themen 1
W Vererbung Generics - mal wieder die verhaßte Rückwärtskompatibilität Allgemeine Java-Themen 2
S Verstaendnisfrage Generics Allgemeine Java-Themen 19
W Generics + Vererbung Allgemeine Java-Themen 47
I Methoden Generics-Methode Allgemeine Java-Themen 3
D Mit Generics arbeiten - Übungsaufgabe Allgemeine Java-Themen 3
K Factory Pattern: Mit Generics umgehen Allgemeine Java-Themen 6
G Generics Allgemeine Java-Themen 31
perlenfischer1984 Liste mit generics zurück liefern Allgemeine Java-Themen 8
Hacer Generics & Collections Allgemeine Java-Themen 8
Neumi5694 Interface Generics für Enum-Filterung verwenden Allgemeine Java-Themen 5
H Collector Generics Problem (incl. Stream & Lambda) Allgemeine Java-Themen 4
C Gemeinsame Oberklasse zweier Generics Allgemeine Java-Themen 10
erdmann Datentypen Methodendeklaration mit Generics Allgemeine Java-Themen 2
Z Datentypen Verschachtelte Generics Allgemeine Java-Themen 1
Neumi5694 Datentypen Generics Allgemeine Java-Themen 5
S Mit Generics Klasse erstellen die selbst T erweitert..? Allgemeine Java-Themen 4
Tarrew Generics - Type erasure Allgemeine Java-Themen 5
N Problem mit Generics und Interface Allgemeine Java-Themen 4
H Generics als Parameter Allgemeine Java-Themen 1
kaoZ Generics und Vererbung Allgemeine Java-Themen 3
A Datentypen Generics: Wie am besten auf Typparameter zugreifen Allgemeine Java-Themen 2
C Generics Objekt in ArrayList Allgemeine Java-Themen 2
vandread Kleine Generics Aufgabe aus einer Prüfung... wie ist das gemeint? Allgemeine Java-Themen 6
G Generics sind zu streng - oder ich zu naiv? Allgemeine Java-Themen 3
G Verschachtelte Generics Allgemeine Java-Themen 2
O Generics Allgemeine Java-Themen 42
M Problem mit Generics Allgemeine Java-Themen 10
M Generics (bounded wildcards statt Interface Bezeichnern) -- Sinn oder Unsinn? Allgemeine Java-Themen 2
darekkay Generics: Wildcard und Object Allgemeine Java-Themen 5
H Collections Generics und Reflection Allgemeine Java-Themen 6
F Google Guice + Generics + Vererbung Allgemeine Java-Themen 5
H Problem mit Java Generics Allgemeine Java-Themen 6
J Generics: Typparameter als Klasse zurückliefern Allgemeine Java-Themen 4
H Generics Allgemeine Java-Themen 5
P Probleme mit Generics Allgemeine Java-Themen 5
B Generics und primitve arrays Allgemeine Java-Themen 6
M Generics Allgemeine Java-Themen 11
1 Collections Generics, internes Verhalten Allgemeine Java-Themen 16
T Warnungsfreie Verwendung von Generics Allgemeine Java-Themen 11
M Probleme mit Generics Allgemeine Java-Themen 5
D Java Generics Allgemeine Java-Themen 8
2 Generics: bounded wildcards Allgemeine Java-Themen 4
J Generics / vermeiden von downcasts Allgemeine Java-Themen 2
2 Generics oder nicht? Allgemeine Java-Themen 8
W Erweitern einer Klasse mit Generics Allgemeine Java-Themen 8
H Generics für Methode Allgemeine Java-Themen 14
N Überladen mit Hilfe von Generics Allgemeine Java-Themen 3
S Generics: Fuer Set<T> ein T-Klassenobjekt erhalten? Allgemeine Java-Themen 3
Q Der innere Typ von Generics? Allgemeine Java-Themen 3
N Generics-NullpointerException Allgemeine Java-Themen 7
2 Generics - Typ Allgemeine Java-Themen 12
P Generics Problem Allgemeine Java-Themen 10
S Type safety Warnings beim casten von Generics Allgemeine Java-Themen 6
N Generics Allgemeine Java-Themen 3
V Frage zu Generics Allgemeine Java-Themen 2
S java generics klassen deklaration Allgemeine Java-Themen 7
B hashtable für unterschiedliche Typen - mit Generics Allgemeine Java-Themen 8
E Generics Allgemeine Java-Themen 3
MQue Generics Allgemeine Java-Themen 4
R Problem mit Reflection und Generics Allgemeine Java-Themen 3
C Klassen, die aufeinander verweisen (mit Generics) Allgemeine Java-Themen 16
G Generics - W.card unter Nutzung von Annotationsklasse? Allgemeine Java-Themen 6
G sortieren von generics Allgemeine Java-Themen 10
G Generics in Map. Type of value abhängig vom key Allgemeine Java-Themen 3
A Generics Verständnisfrage Allgemeine Java-Themen 7
Z Generics funzt nicht? Allgemeine Java-Themen 2
T Generics Allgemeine Java-Themen 18
G ComboBox: Nur eine Art Klasse zulassen (Generics) Allgemeine Java-Themen 3
J Generics Expertenwissen? Allgemeine Java-Themen 5
S Generics-Problem Allgemeine Java-Themen 3
T Generics und Wil-dcards Allgemeine Java-Themen 8
Q Typen von Generics & Casten Allgemeine Java-Themen 3
S Generics Allgemeine Java-Themen 2
R Problem mit Generics Allgemeine Java-Themen 2
G Trotz Generics Cast-Fehler! Allgemeine Java-Themen 5
T TreeMap durch Comparator mit Generics sortieren Allgemeine Java-Themen 9
T Generics und instanceof Allgemeine Java-Themen 10
T Generics und Exceptions Allgemeine Java-Themen 6
M Beliebig viele Typen bei Generics Allgemeine Java-Themen 3
G Reflection objekt mit generics erzeugen Allgemeine Java-Themen 5
S Singleton Pattern mit Generics Allgemeine Java-Themen 4
H Generics Problem Allgemeine Java-Themen 3
F Generics: spricht etwas dagegen raw types zu verwenden? Allgemeine Java-Themen 31
M Generics - besser programmieren, Warnung umgehen Allgemeine Java-Themen 4
E Java, UML, Generics Allgemeine Java-Themen 6
P Array von Vectoren + Generics Allgemeine Java-Themen 6
M ArrayList erweitern - generics Allgemeine Java-Themen 4
E Generics -> UML Allgemeine Java-Themen 4
G Generics: Instanzieren einer Klasse in einer Methode. Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben