2013-10-31 22 views
8

Tôi đang thực hiện một dự án java và tôi gặp phải vấn đề này và không biết cách sửa lỗi.MyClass không thể chuyển sang java.lang.Comparable: java.lang.ClassCastException

Các lớp học trong dự án của tôi (giản thể):

public class Item { 

    private String itemID; 
    private Integer price; 

    public Integer getPrice() { 

     return this.price; 

    } 

} 

public class Store { 

    private String storeID; 
    private String address; 

} 

public class Stock { 

    private Item item; 
    private Store store; 
    private Integer itemCount; 

    public Integer getInventoryValue() { 

     return this.item.getPrice() * this.itemCount; 

    } 
} 

Sau đó, tôi cố gắng sắp xếp một ArrayList của Cổ vì vậy tôi tạo ra một lớp được gọi là CompareByValue

public class CompareByValue implements Comparator<Stock> { 

    @Override 
    public int compare(Stock stock1, Stock stock2) { 

     return (stock1.getInventoryValue() - stock2.getInventoryValue()); 

    } 

}

Khi tôi cố gắng chạy chương trình, nó cho lỗi:

Exception in thread "main" java.lang.ClassCastException: Stock cannot be cast to java.lang.Comparable

Bất cứ ai biết điều gì sai?

+1

Làm thế nào để bạn chạy chương trình, đặc biệt là nơi bạn sắp xếp danh sách? –

Trả lời

12

Đó là vì Stock không triển khai Comparable. Hoặc thực hiện nó:

public class Stock implements Comparable<Stock> { 
    public int compareTo(Stock o) { 
     // ... 
    } 
} 

... Hoặc vượt qua một thể hiện của CompareByValue như tham số cho phương thức sort():

Collections.sort(list, new CompareByValue()); 
0

chỉ từ trên mã, có vẻ tốt đẹp. bạn có chắc là ngoại lệ từ mã trên không? nếu bạn chỉ đặt đối tượng Cổ phiếu vào bất kỳ bộ sưu tập được sắp xếp nào, bạn sẽ thấy ngoại lệ như vậy và cần triển khai Giao diện có thể so sánh.

Nhưng đối với trường hợp chỉ vượt qua Công cụ so sánh tùy chỉnh của bạn, bạn không cần phải thực hiện Stock để so sánh. nó là trường hợp tương tự như bạn cung cấp cho việc thực hiện Comparator ẩn danh.

đặt bộ so sánh của bạn thành bộ sưu tập được sắp xếp như TreeSet và sau đó thêm đối tượng cổ phiếu vào bộ sưu tập được sắp xếp, nó sẽ hoạt động mà không cần triển khai Giao diện có thể so sánh.

+0

Tôi xin lỗi mọi người. Chỉ cần phát hiện ra có một lỗi đánh máy trong tập tin txt tạo một đối tượng null được tạo và thêm vào ArrayList. Vui lòng xóa câu hỏi này càng sớm càng tốt. – user2234225

Các vấn đề liên quan