2010-08-19 37 views

Trả lời

9

Có thể thực hiện được, nhưng type erasure có thể gây khó khăn cho bạn. Khi các câu trả lời khác thảo luận, bạn phải tạo một lớp con của ParameterizedClass hoặc thêm một trường loại T vào ParameterizedClass và mã phản chiếu bạn cần thực hiện là phức tạp.

gì tôi khuyên bạn nên trong những trường hợp này, là để làm việc xung quanh vấn đề như thế này:

class ParameterizedClass<T> { 
    private Class<T> type; 

    /** Factory method */ 
    public static <T> ParameterizedClass<T> of(Class<T> type) { 
     return new ParameterizedClass<T>(type); 
    } 

    /** Private constructor; use the factory method instead */ 
    private ParameterizedClass(Class<T> type) { 
     this.type = type; 
    } 

    // Do something useful with type 
} 

Do suy luận kiểu của Java cho các phương pháp tĩnh, bạn có thể xây dựng lớp học của bạn mà không cần quá nhiều boilerplate thêm:

ParameterizedClass<Something> foo = ParameterizedClass.of(Something.class); 

Bằng cách đó, ParameterizedClass của bạn hoàn toàn chung chung và loại an toàn và bạn vẫn có quyền truy cập vào đối tượng lớp học.

EDIT: Kính gửi bình luận

+0

Nó *** có thể xảy ra. Câu trả lời này là sai. Kiểm tra câu trả lời khác có giải pháp. –

+0

@AdamArold Tôi đã không biết nó tại thời điểm tôi đã viết câu trả lời, nhưng bạn nói đúng. Tôi vẫn không khuyên bạn nên nó, mặc dù. Tôi đã cập nhật câu trả lời của mình cho phù hợp. – jqno

8

Bạn có thể sử dụng thủ thuật này trong constructor của bạn: (xem http://www.hibernate.org/328.html)

Class<T> parameterType = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 

Nhưng tôi tin rằng mã này chỉ hoạt động khi lớp là tiểu phân loại và một thể hiện của các sub-class thực hiện nó.

+0

Tôi biết mẹo này và đang sử dụng trên các lớp DAO. Nhưng đây không phải là những gì tôi đang tìm kiếm. Để sử dụng thủ thuật này, tôi đoán, chúng ta phải xác định giá trị thực của loại generic của lớp cha trên mã nguồn. GenericDAO UserDAO mở rộng GenericDAO TanerDiler

3

Nếu bạn muốn chỉ từ chính đối tượng, bạn không thể. Loại tẩy xóa có nghĩa là thông tin bị mất.

Nếu bạn có trường sử dụng loại được tham số với đối số kiểu bê tông mặc dù, thông tin sẽ được giữ nguyên.

Xem Angelika Langer's Generics FAQ và đặc biệt là section on type erasure.

0

Đây là một đề tài chủ yếu là vấn đề, vì nó chỉ có tác dụng trong điều kiện nhất định như mong đợi (expecially trong tình huống phức tạp).

Nhưng Xebia đã xuất bản good article về toàn bộ điều.

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