2013-07-29 32 views
5

Tôi có một số lớp trừu tượng mỗi superclassing ba hoặc bốn người cụ thể và có dạng:Java - Collection.Sort qua giao diện 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 
    } 
} 

Ở những nơi khác trong mã của tôi Tôi có một ArrayList<MapObject> (mà đang được dân cư chính xác, tôi đã kiểm tra) được gọi là tempMapObjectsArray Tôi muốn sắp xếp rằng ArrayList sử dụng Collections.sort(tempMapObjectsArray) (hoặc, thay vào đó, tôi muốn sắp xếp ArrayList và có vẻ như Collections.sort() là cách tốt nhất để làm điều đó. Cách cụ thể được sắp xếp không quan trọng) .

Nó không biên soạn và đưa ra thông điệp (trong 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>) 

Dường như tôi đang định sai chung trong lớp TypeOfMapObject, nhưng đây là lần đầu tiên tôi đã thực sự sử dụng Generics và nó đạt đến giai đoạn mà tôi chỉ đơn giản là cố gắng nhiều hơn hoặc ít hơn một cách ngẫu nhiên. Tôi đang đọc qua các tutorial nhưng cho đến nay nó chỉ đơn giản là không "nhấp vào" những gì tôi đang làm sai.

EDIT: Mỗi lớp con của các lớp trừu tượng khác nhau cần phải so sánh với nhau - vì vậy nếu tôi có lớp trừu tượng TypeofMapObject1, TypeOfMapObject2 v.v ... thì tôi cần có thể so sánh phân lớp 1 với lớp con 2.

+0

Khi bạn nói "Nó đang ném lên ..." bạn có nghĩa là đoạn mã trên biên dịch và bạn nhận được ngoại lệ trong thời gian chạy? –

+0

Không, xin lỗi vì không rõ ràng. Đó là một lỗi thời gian biên dịch. Đã chỉnh sửa để phản ánh – MrB

Trả lời

10

trận đấu loại tương đương với lớp:

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

Hoặc đơn giản là không xác định phương thức compareTo trong lớp trừu tượng của bạn - để nó cho lớp con để thực hiện.


Để giải quyết chỉnh sửa cho câu hỏi:

Nếu bạn muốn so sánh phân nhóm khác nhau, đã cho họ thực hiện một phương thức trả về một giá trị (nói String) mà họ có thể được so sánh. Ví dụ:

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

Loại trở về từ các compareValue() có thể bất cứ điều gì compareable, ví dụ như Integer, ngày, bất cứ điều gì.

+0

SOrry vì không rõ ràng - tôi cần phải có thể so sánh các thứ 'TypeOfMapOject' khác nhau với nhau - vì vậy nhiều loại lớp trừu tượng mà tất cả chúng đều cần phải so sánh với nhau. Câu hỏi đã chỉnh sửa để phản ánh điều này. – MrB

+0

Thử chỉnh sửa ở cuối câu trả lời – Bohemian

+0

Thiên tài! Tôi đã bị treo trên generics và không nhìn vào các tùy chọn khác. Cảm ơn bạn. – MrB