Thực tế, bạn có thể làm những gì bạn muốn. Nếu bạn muốn cung cấp nhiều giao diện hoặc một lớp cộng với giao diện, bạn phải có ký tự đại diện của bạn trông như thế này:
<T extends ClassA & InterfaceB>
Xem Generics Tutorial tại sun.com, đặc biệt là phần Bounded Type Parameters, ở dưới cùng của trang . Bạn thực sự có thể liệt kê nhiều giao diện nếu muốn, sử dụng & InterfaceName
cho mỗi giao diện mà bạn cần.
Điều này có thể phức tạp tùy ý. Để chứng minh, hãy xem tuyên bố JavaDoc của Collections#max
, được bao bọc trên hai dòng là:
tại sao quá phức tạp? Như đã nói trong Câu hỏi thường gặp về Java Generics: To preserve binary compatibility.
Có vẻ như điều này không hiệu quả đối với việc khai báo biến, nhưng nó hoạt động khi đặt một ranh giới chung trên một lớp. Vì vậy, để làm những gì bạn muốn, bạn có thể phải nhảy qua một vài hoops. Nhưng bạn có thể làm điều đó. Bạn có thể làm một cái gì đó như thế này, đặt một ranh giới chung trên lớp học của bạn và sau đó:
class classB { }
interface interfaceC { }
public class MyClass<T extends classB & interfaceC> {
Class<T> variable;
}
để có được variable
có những hạn chế mà bạn muốn. Để biết thêm thông tin và ví dụ, hãy xem trang 3 của Generics in Java 5.0. Lưu ý, trong <T extends B & C>
, tên lớp phải đến trước và giao diện theo sau. Và tất nhiên bạn chỉ có thể liệt kê một lớp duy nhất.
Nhưng tại sao tôi phải truyền đối tượng đến T khi trả lại? –
@BernhardV: Bạn cần cung cấp thêm thông tin trước khi tôi có thể trả lời. Trong trường hợp nào bạn cần phải đúc? – Eddie
Điều này hữu ích. Điều đáng nói đến là lớp _must_ đến trước, bạn không thể nói ''. –
EricS