2016-08-04 13 views
7

Làm cách nào để chuyển đổi java.lang.reflect.Type thành Class<T> clazz?Chuyển đổi java.lang.reflect.Type thành Class <T> clazz

Nếu tôi có một phương pháp như sau trong đó có một cuộc tranh cãi của Class<T>:

public void oneMethod(Class<T> clazz) {  
    //Impl 
} 

Sau đó, một phương pháp trong đó có một cuộc tranh cãi của java.lang.reflect.Type và nó gọi oneMethod(Class<T> clazz) và cho nó tôi cần phải chuyển đổi java.lang.reflect.Type type để Class<T>:

public void someMehtod(java.lang.reflect.Type type) { 
    // I want to pass type arg to other method converted in Class<T> 
    otherMethod(¿How to convert java.lang.reflect.Type to Class<T>?); 
} 

Có thể không?

Trả lời

6

Bạn phải đảm bảo rằng type là phiên bản Class và sau đó truyền.

if (type instanceof Class) { 
    @SuppressWarnings("unchecked") 
    Class<?> clazz = (Class<?>) type; 
    otherMethod(clazz); 
} 

Tất nhiên, bạn cũng phải xử lý trường hợp không phải là Class.

-1

Ý của bạn là gì?

public <T extends Type> void oneMethod(T clazz) { 

} 

public void someMethod(Type type) { 
    oneMethod(type); 
} 
+1

Bạn chỉ đang di chuyển vấn đề vào bên trong phương thức – NatNgs

1

Nó sẽ là kỳ lạ rằng một Type sẽ là bất cứ điều gì khác hơn là một Class ... Javadoc cho Type nói

Tất cả các lớp Thực hiện Known: Lớp

Vì vậy, trừ khi bạn có các thư viện đặc biệt sử dụng không ClassType s, bạn có thể chỉ cần truyền - nhưng bạn phải sẵn sàng để có thể ClassCastException. Hãy coi chừng: Java sử dụng triển khai Kiểu không có giấy tờ để đại diện cho generics, xem bên dưới.

Bạn explicitely có thể xử lý nó hay không bởi vì nó là một ngoại lệ được kiểm soát:

cách Explicit:

try { 
    Class<?> clazz = (Class<?>) type; 
} 
catch (ClassCastException ex) { 
    // process exception 
} 

cách ngầm định:

Class<?> clazz = (Class<?>) type; 

nhưng phương pháp hiện tại có thể ném .. .


CHỈNH SỬA cho mỗi nhận xét của @Andy Turner:

Hãy chú ý: Type type = new ArrayList<String>().getClass().getGenericSuperclass(); mang lại thứ gì đó là Loại nhưng không phải là Lớp. Cái này là ParameterizedType, vì vậy bạn có thể sử dụng phương thức getRawType() để tìm lớp thực tế, nhưng những người khác có thể tồn tại.

+2

ví dụ: 'Type type = new ArrayList () .getClass(). GetGenericSuperclass();' tạo ra một cái gì đó là một 'Loại' nhưng không phải là một' Lớp'. [Bản trình diễn Ideone] (http://ideone.com/kwdkvj). –

+1

@AndyTurner: bạn nói đúng, đó là một lớp không có giấy tờ nội bộ ... Người ta phải đoán rằng nó thực hiện 'ParameterizedType' và sau đó sử dụng' getRawType() 'để tìm một lớp đúng. –

+0

@SergeBallesta: Đó là vấn đề.'Loại' có thể là một thể hiện của' Lớp', hoặc nó có thể là một thể hiện của 'ParameterizedType',' TypeVariable', 'WildcardType', hoặc' GenericArrayType'. Sau 4 là giao diện; lớp thực hiện không liên quan. – newacct

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