2010-04-21 25 views
12

Tôi đang nâng cấp một số mã lên Java 5 và rõ ràng không hiểu điều gì đó với Generics. Tôi có các lớp khác mà thực hiện Comparable một lần, mà tôi đã có thể thực hiện. Nhưng bây giờ tôi đã có một lớp mà, do thừa kế, kết thúc cố gắng để thực hiện Comparable cho 2 loại. Dưới đây là tình hình của tôi:Tôi có thể triển khai So sánh nhiều lần như thế nào?

Tôi đã có các lớp sau/interfaces:

interface Foo extends Comparable<Foo> 

interface Bar extends Comparable<Bar> 

abstract class BarDescription implements Bar 

class FooBar extends BarDescription implements Foo 

Với điều này, tôi nhận được lỗi 'giao diện Comparable không thể được thực hiện nhiều hơn một lần với lý lẽ khác nhau ...'

Tại sao tôi không thể có một compareTo (Foo foo) được triển khai trong FooBar và cũng là một compareTo (Bar) được triển khai trong BarDescription? Đây không phải là phương pháp quá tải đơn giản sao?

Chỉnh sửa: Tôi có nhiều lớp mở rộng BarDescription. Nếu tôi loại bỏ các tham số kiểu cho Comparable trên Bar, để nó ở trạng thái thô, sau đó tôi nhận được một loạt các cảnh báo trình biên dịch khi sắp xếp tất cả các lớp mở rộng BarDescription. Điều này sẽ được giải quyết với các ký tự đại diện trả lời dưới đây? Câu trả lời đó trông khá phức tạp và khó hiểu để bảo trì.

+0

Câu hỏi tương tự, trường hợp khác. Bạn đang tìm kiếm một cái gì đó gọi là loại tẩy xoá. – falstro

+0

@row Cái gì đó được gọi là ký tự đại diện. –

+3

@ codeman73: nhưng bạn chỉ đơn giản là không thể làm điều đó trong Java ... Java không hỗ trợ đa hình tham số thực sự. Đây là lý do tại sao khi bạn tập trung vào "OO" thay vì "Java idiosynchrasies" các Generics Java chủ yếu là vô nghĩa: chắc chắn, chúng tốt cho "bộ sưu tập" và cho chương trình thủ tục (và do đó cũng phù hợp với tâm lý của 99% của Các nhà phát triển Java trên mạng) nhưng nó đơn giản không phải là OO. Đó là sự kìm kẹp lớn nhất của tôi với Generics trong Java: bạn không thể có cả hai * Handable * và * Handable * và làm cho Generics ** vô ích ** từ một quan điểm OO. – SyntaxT3rr0r

Trả lời

14

Generics không tồn tại sau khi bytecode đã được biên dịch.

Hạn chế từ điều này: Bạn không thể triển khai/mở rộng hai hoặc nhiều giao diện/lớp học sẽ giống nhau mà không có thông số chung và khác với thông số chung.

gì bạn có thể làm nếu bạn thực sự thực sự muốn loại an toàn là:

interface Foo<T extends Foo<?>> extends Comparable<T> 
interface Bar<T extends Bar<?>> extends Comparable<T> 
abstract class BarDescription<T extends Bar<?>> implements Bar<T> 
class FooBar extends BarDescription<FooBar> implements Foo<FooBar> 
+0

Đây là loại hoạt động. Tôi vẫn đang cố gắng quấn đầu quanh nó. Tại sao chúng ta cần số Tôi ước mình đã tạo ra bài đăng gốc của mình với các ví dụ cụ thể hơn. – user26270

+0

Ngoài ra, không phải là nó thừa để có giao diện Foo >? Một vấn đề khác là tôi có nhiều lớp mở rộng BarDescription nhưng không phải Foo, và bây giờ tất cả những điều này phải xác định loại cho BarDescription và thực hiện compareTo (AnotherBarDescription), chẳng hạn như: class AnotherBarDescription mở rộng BarDescription user26270

+0

Vâng. nhưng Java Generics có vấn đề. Một vấn đề lớn là thừa kế (siêu loại là? Thay vì Object). Ví dụ: Foo foo = new Foo () không được phép. – mkorpela

8

Tôi muốn viết một vài Comparator s và được thực hiện với nó.

1

Việc triển khai nhiều giao diện chung sẽ gặp sự cố khi bạn xem xét các ký tự đại diện.

Điều này không phụ thuộc vào việc xóa.

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