2013-07-29 5 views
5

Ich habe eine Reihe von abstrakten Klassen jeweils Superclassing drei oder vier konkrete Einsen und die Form:Java - Collection.Sort über Interface-Objekte

public abstract class TypeOfMapObject extends IrrelevantClass implements Serializable, MapObject, Comparable<MapObject> 
{ 
    //irrelevant stuff 
    @Override 
    public int compareTo(MapObject m) 
    { 
    //specific algorithm for natural ordering 
    } 
} 

An anderer Stelle in meinem Code habe ich ein ArrayList<MapObject> (die bevölkerungs wird richtig, ich habe das überprüft) tempMapObjectsArray Ich möchte das ArrayList mit Collections.sort(tempMapObjectsArray) (oder, lieber, ich möchte das ArrayList sortieren und es scheint Collections.sort() ist der beste Weg, es zu tun. Die spezifische Art, wie es ist nicht wichtig) sortieren .

Es ist nicht kompilieren und gibt die Nachricht (in Netbeans):

no suitable method found for sort(java.util.ArrayList<Model.MapObject>) 
method java.util.Collections.<T>sort(java.util.List<T>,java.util.Comparator<? super T>) is not applicable 
(cannot instantiate from arguments because actual and formal argument lists differ in length) 
method java.util.Collections.<T>sort(java.util.List<T>) is not applicable 
    (inferred type does not conform to declared bound(s) 
    inferred: Model.MapObject 
    bound(s): java.lang.Comparable<? super Model.MapObject>) 

Es scheint, dass ich die allgemeinen falsch in der TypeOfMapObject Klasse bin definiert, aber dies ist das erste Mal, dass ich wirklich Generika verwendet habe, und es ist Ich habe die Phase erreicht, in der ich die Dinge einfach mehr oder weniger zufällig ausprobiere. Ich lese durch die tutorial aber bis jetzt ist es einfach nicht "klicken", was ich falsch mache.

EDIT: Jede der Unterklassen der verschiedenen abstrakten Klassen müssen miteinander vergleichbar sein - also wenn ich abstrakte Klassen haben TypeofMapObject1, TypeOfMapObject2 etc, dann müssen ich in der Lage sein, eine Unterklasse von 1 zu einer Unterklasse von vergleichen 2.

+0

Wenn du sagst "Es wird kotzen ..." meinst du, dass das obige Snippet kompiliert wird und du die Ausnahme zur Laufzeit bekommst? –

+0

Nein, Entschuldigung wegen Unklarheit. Es ist ein Kompilierzeitfehler. Bearbeitet, um zu widerspiegeln – MrB

Antwort

10

Spiel des vergleichbaren Typs mit der Klasse:

public abstract class TypeOfMapObject extends IrrelevantClass implements Serializable, MapObject, Comparable<TypeOfMapObject> { 
    @Override 
    public int compareTo(TypeOfMapObject m) 
    { 
     //specific algorithm for natural ordering 
    } 
} 

Oder einfach nicht die compareTo Methode in der abstrakten Klasse definieren - lassen sie es für die Unterklasse zu implementieren.


bearbeiten, um Frage zu beantworten:

Wenn Sie verschiedene Subtypen vergleichen wollen, haben sie eine Methode implementieren, die einen Wert (sagen String) zurück, mit denen sie verglichen werden können. Zum Beispiel:

public abstract class TypeOfMapObject extends IrrelevantClass implements Serializable, MapObject, Comparable<TypeOfMapObject> { 
    @Override 
    public int compareTo(TypeOfMapObject m) 
    { 
     return compareValue().compareTo(m.compareValue()); 
    } 

    // subclasses to return their value to compare 
    protected abstract String compareValue(); 
} 

Der Typ zurückgegeben vom compareValue() kann alles vergleichbar, zB Integer, Date, was auch immer.

+0

Sorry für Unklarheit - ich muss in der Lage sein, verschiedene 'TypeOfMapOject' Dinge miteinander zu vergleichen - so von den verschiedenen Arten der abstrakten Klasse, die sie alle miteinander vergleichen müssen. Bearbeitete Frage, um dies zu reflektieren. – MrB

+0

Versuchen Sie die Bearbeitung am Ende der Antwort – Bohemian

+0

Genius! Ich habe mich an Generika geklammert und habe mir keine anderen Optionen angesehen. Vielen Dank. – MrB