2010-01-17 6 views
34

Trước hết, tôi chỉ biết về các khái niệm cơ bản về Java. Bây giờ tôi có các tình huống sau:Làm thế nào để thiết lập các ràng buộc về các kiểu generic trong Java?

Tôi có một lớp generic:

public class ListObject<T> 
{ 
    // fields 
    protected T _Value = null; 
     // .. 
} 

Bây giờ tôi muốn làm điều gì đó như sau:

ListObject<MyClass> foo = new ListObject<MyClass>(); 
ListObject<MyClass> foo2 = new ListObject<MyClass>(); 
foo.compareTo(foo2); 

Vấn đề là, làm thế nào tôi có thể xác định .compareTo() Phương pháp trong khi T là chung? Tôi đoán tôi đã bằng cách nào đó để thực hiện một ràng buộc trên T chung để nói rằng T thực hiện một giao diện cụ thể (có thể so sánh, nếu có tồn tại).

Có ai có thể cung cấp cho tôi một mẫu mã nhỏ không?

Trả lời

41

đọc cũng thảo luận ở đây: Generics and sorting in Java

Câu trả lời ngắn, tốt nhất bạn có thể nhận được là:

012.
class ListObject<T extends Comparable<? super T>> { 
    ... 
} 

Nhưng đó cũng là lý do để chỉ cần sử dụng:

class ListObject<T extends Comparable> { 
    ... 
} 
+1

Tôi sẽ dính vào ListObject cho thời điểm này. – citronas

+3

Đồng thời kiểm tra các chủ đề liên quan: http://stackoverflow.com/questions/2064169/what-does-this-class-declaration-mean-in-java/2072820, thảo luận về sự cần thiết cho ký tự đại diện của biểu mẫu: sateesh

2

Hãy thử public class ListObject<T extends U>. Chỉ T s thực hiện U (hoặc có nguồn gốc từ U) mới được phép thay thế.

+0

Cung cấp cho tôi một lỗi biên dịch. Ngay cả với một TestClass đơn giản như vậy: public class ConstraintTest {} Lỗi cú pháp được tấm vé về "dụng cụ" ,, dự kiến ​​ tôi thiếu gì? – citronas

+0

@citronas: Nó thực sự là 'mở rộng' ngay cả đối với giao diện. Lưu ý rằng nếu bạn sử dụng một lớp cơ sở với thuộc tính 'extends', bạn thực sự có thể thêm lớp cơ sở trực tiếp vào đối tượng generified nữa, đó là tác dụng phụ * (và tồi tệ nhất) lớn nhất của phần mở rộng Generics. – Esko

+0

Rất tiếc. Của tôi xấu, cảm ơn cho bắt, @Esko. –

-2
public class ListObject<T implements Comparable> {...} 
+4

-1 Đã bỏ phiếu xuống vì So sánh không có tham số kiểu là loại thô mà bạn không nên sử dụng với Java 1.5+ – helpermethod

+2

đây không phải là cú pháp hợp lệ – newacct

4

Điều này phụ thuộc vào chính xác những gì bạn muốn phương thức compareTo thực hiện. Đơn giản chỉ cần xác định phương thức compareTo để có ListObject<T> giá trị khác được thực hiện bởi sau

public class ListObject<T> { 
    public int compareTo(ListObject<T> other) { 
    ... 
    } 
} 

Tuy nhiên nếu bạn muốn thực sự gọi các phương thức trên thông số mà bạn sẽ cần phải thêm một số hạn chế để cung cấp thêm thông tin về giá trị T như nên

class ListObject<T extends Comparable<T>> { 
    ... 
}