2009-11-03 41 views
6
public Interface Foo<T extends Colors>{...} 

Có cách nào để truy xuất T nào được đưa ra để thực hiện Foo không?Generics Java - truy xuất loại

Ví dụ,

public Class FooImpl implements Foo<Green>{..} 

Would return Xanh.

+0

Từ đâu bạn cố gắng lấy nó –

Trả lời

15

Trái ngược với câu trả lời khác, bạn có thể nhận được loại thông số chung. Ví dụ, thêm này đến một phương pháp bên trong một lớp học chung sẽ có được các thông số đầu tiên chung của lớp (T trong trường hợp của bạn):

ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass(); 
type.getActualTypeArguments()[0] 

tôi sử dụng kỹ thuật này trong một DAO Hibernate chung tôi đã viết để tôi có thể có được lớp thực tế đang được tiếp tục bởi vì nó là cần thiết bởi Hibernate. Nó hoạt động!

+0

Điều này sẽ cung cấp cho các loại tham số khai báo - nhưng có vẻ như đó là những gì là muốn anyway. –

+1

+1, luôn vui vẻ khi biết điều gì đó, ngay cả khi bạn phải làm sai. – JaredPar

+0

Cảm ơn bạn đã theo dõi điều này. Tôi đã nghĩ rằng câu trả lời là những gì @ JaredPar nói trước khi tôi thậm chí còn hỏi câu hỏi, vì vậy tôi đoán tôi là một chút quá nhanh chóng trong việc chấp nhận nó! – tinkertime

9

EDIT

Hóa ra đối với trường hợp này, nó có thể để có được những thông tin chung chung. Singleshot đã đăng một số answer. Anh ta nên là câu trả lời được chấp nhận. Tái đánh giá mỏ.

Nói chung, mặc dù có nhiều trường hợp bạn không thể nhận thông tin loại mà bạn có thể mong đợi ở đó. Java sử dụng một kỹ thuật được gọi là loại xóa mà loại bỏ các loại từ chung tại thời gian biên dịch. Điều này ngăn cản bạn nhận được thông tin về ràng buộc thực sự của chúng khi chạy trong nhiều trường hợp.

đẹp FAQ về chủ đề này:

+0

Đây là sai Bạn có thể gọi lớp ' .getGenericInterfaces() 'và lấy các đối số kiểu từ' ParameterizedType' – ChssPly76

+0

Tôi đồng ý. Xem câu trả lời của tôi, đó là mã tôi thực sự sử dụng trong một DAO Hibernate chung tôi đã viết – SingleShot

+0

@SingleShot, @ ChssPly76, rất hay biết điều này là có thể. đã cập nhật câu trả lời của tôi về cơ bản trỏ đến câu trả lời của @ SingleShot – JaredPar

-2

[sửa] Ok, rõ ràng là một phần có thể. Giải thích tốt về cách thực hiện điều đó, (bao gồm cả cải tiến khi phương thức được đăng bởi SingleShot): http://www.artima.com/weblogs/viewpost.jsp?thread=208860

+0

có lẽ nên đọc 'Lớp getTypeParameter() 'và' Lớp getTypeParameter' .. – falstro

0

Một cách để thực hiện điều này là chuyển một cách rõ ràng trong một đối tượng Lớp có loại đó. Một cái gì đó như sau:

public class FooImpl<T extends Colors> { 
    private Class<T> colorClass; 
    public FooImpl(T colorClass) { 
    this.colorClass = colorClass; 
    } 
    public Class<T> getColorClass() { 
    return colorClass; 
    } 
} 
0

Phụ thuộc vào ý của bạn. Chỉ cần T có thể là những gì bạn muốn, ví dụ:

public Interface Foo<T extends Colors>{ public T returnType() {...} ...} 
1

Có. Nhìn vào [Javadoc cho java.lang.Class # getGenericInterfaces()] (http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html#getGenericInterfaces())

Như thế này:.?.

public class Test1 { 

    interface GenericOne<T> { 
    } 

    public class Impl implements GenericOne<Long> { 
    } 

    public static void main(String[] argv) { 
     Class c = (Class) ((ParameterizedType) Impl.class.getGenericInterfaces()[0]).getActualTypeArguments()[0]; 
     System.out.println(c); 
    } 
}