2010-06-13 32 views
7

Tôi có lớp sauLấy loại tham số lớp parametrized?

public class MyClass<T> { 
    public Class<T> getDomainClass() { 
      GET THE CLASS OF T 
    } 
} 

Tôi đã googled vấn đề này và tất cả các câu trả lời tôi có thể tìm thấy nói với tôi để sử dụng getGenericSuperClass(), nhưng vấn đề của phương pháp này là tôi phải có một lớp thứ hai mở rộng MyClass và tôi không muốn làm điều này. Những gì tôi cần là để có được loại parametrized của một lớp bê tông?

+0

Bạn có thấy: http://stackoverflow.com/questions/1901164/get-type-of-a-generic-parameter-in-java-with-reflection? – Campa

Trả lời

5

Bạn không thể. Thông tin bạn muốn (nghĩa là giá trị của T) không có sẵn trong thời gian chạy do loại xóa.

0

Nếu bạn cần biết loại có thể bạn không nên sử dụng Generics.

3

Do xóa bỏ kiểu, cách duy nhất để lấy nó là nếu nó được chuyển như một tham số rõ ràng - hoặc trong một phương thức hoặc trong hàm tạo.

public class MyClass<T> { 
    public Class<T> getDomainClass(Class<T> theClass) { 
      // use theClass 
    } 
} 
3

Cách duy nhất tôi biết:

public class MyClass<T> { 

    private Class<T> clazz; 

    public MyClass(Class<T> clazz) { 
     this.clazz = clazz; 
    } 

    public Class<T> getDomainClass() { 
     return clazz; 
    } 
} 

Vì vậy, về cơ bản bạn cung cấp thời gian chạy các thông tin, nó không có từ trình biên dịch.

1

Bạn có thể làm điều đó nếu bạn muốn nhận được một loại chung mà bạn thừa hưởng! Thêm phương thức này vào lớp và lợi nhuận của bạn! ;)

public Class<?> getGenericType() { 
    Class result = null; 
    Type type = this.getClass().getGenericSuperclass(); 

    if (type instanceof ParameterizedType) { 
     ParameterizedType pt = (ParameterizedType) type; 
     Type[] fieldArgTypes = pt.getActualTypeArguments(); 
     result = (Class) fieldArgTypes[0]; 
    } 

    return result; 
} 
Các vấn đề liên quan