2013-07-29 14 views
5

Ho un certo numero di classi astratte ogni superclassing tre o quattro più concreti e della forma:Java - Collection.Sort oltre Interface Objects

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

Altrove nel mio codice ho un ArrayList<MapObject> (che viene popolata correttamente, l'ho verificato) chiamato tempMapObjectsArray Voglio ordinare quello ArrayList usando Collections.sort(tempMapObjectsArray) (o, piuttosto, voglio ordinare quello ArrayList e sembra che Collections.sort() sia il modo migliore per farlo.Il modo specifico ordinato non è importante) .

Non è la compilazione e dando il messaggio (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>) 

Sembra che io sto definendo il torto generica nella classe TypeOfMapObject, ma questa è la prima volta che ho davvero utilizzato farmaci generici ed è raggiunto il livello in cui sto semplicemente provando le cose più o meno a caso. Sto leggendo lo tutorial ma finora semplicemente non "clicco" quello che sto facendo male.

EDIT: Ognuna delle sottoclassi delle varie classi astratte devono essere comparabili tra di loro - quindi se ho classi astratte TypeofMapObject1, TypeOfMapObject2 ecc, quindi ho bisogno di essere in grado di confrontare una sottoclasse di 1 ad una sottoclasse di 2.

+0

Quando si dice "Si sta vomitando ..." si intende che lo snippet sopra riportato viene compilato e si ottiene l'eccezione in runtime? –

+0

No, mi dispiace per non essere chiaro. È un errore in fase di compilazione. Modificato per riflettere – MrB

risposta

10

Partita tipo comparabile con la classe:

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

o semplicemente non definiscono il metodo compareTo nella classe astratta - lasciare per la sottoclasse da implementare.


Per affrontare modifica alla domanda:

Se si desidera confrontare diversi sottotipi, li hanno implementare un metodo che restituisce un valore (ad esempio String) con cui possono essere confrontati. Per esempio:

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(); 
} 

Il tipo restituito dal compareValue() può essere qualsiasi cosa compareable, ad esempio Integer, data, qualsiasi cosa.

+0

SOrry per non essere chiaro - Devo essere in grado di confrontare diversi oggetti 'TypeOfMapOject' l'uno con l'altro - quindi, tra i diversi tipi di classi astratte, tutti devono essere comparabili l'uno con l'altro. Domanda modificata per riflettere questo. – MrB

+0

Prova la modifica nella parte inferiore della risposta – Bohemian

+0

Genius! Sono stato appeso ai farmaci generici e non ho esaminato altre opzioni. Grazie. – MrB