2015-05-26 12 views
5
Class<? extends MyClass> cls = (Class<? extends MyClass>) Class.forName(className); 
someMethod(cls); // someMethod expects a Class<? extends MyClass> 

Tuyên bố trên đưa ra cảnh báo "Loại an toàn: Bỏ chọn mẫu từ Class<capture#5-of ?> đến Class<? extends MyClass>".Có cách nào để đúc một lớp để có các tham số cụ thể cho java.lang.Class <> generic không?

Class<?> cls0 = Class.forName(className); 
if (cls0 instanceof Class<? extends MyClass>) { 
    Class<? extends MyClass> cls = (Class<? extends MyClass>)cls0; 
    someMethod(cls); 
} 

Lần này tôi nhận được một lỗi, vì loại tẩy xoá ...

Class<?> cls0 = Class.forName(className); 
if (MyClass.class.isAssignableFrom(cls0)) { 
    Class<? extends MyClass> cls = (Class<? extends MyClass>)cls0; 
    someMethod(cls); 
} 

Lần này tôi biết rằng các diễn viên là an toàn, nhưng trình biên dịch không, và vẫn mang lại cho cảnh báo. (Nếu bạn hỏi tôi, trình biên dịch hơi dày ở đây.)

Có cách nào để tránh cảnh báo này (ngoại trừ SuppressWarnings) không?

+0

bạn "kiểm tra" trước khi bạn cast, vì vậy nó không chính xác "dàn diễn viên không được kiểm soát". bạn biết tốt hơn so với trình biên dịch trong trường hợp này, vì vậy chỉ cần nói với nó để thư giãn :) - liên quan - http://stackoverflow.com/questions/16611053/generics-oddity-i-can-insert-a-long-value-into -a-mapstring-string-and-it-co/16612897 # 16612897 – ZhongYu

+0

Điều quan trọng cần nhớ là 'Lớp' đặc biệt ở chỗ nó đại diện cho tham số kiểu riêng của nó. – biziclop

+0

Vì vậy, đoạn mã cuối cùng của bạn và '@ SuppressWarnings' là cách để đi đến đây hoặc một bước tốt hơn là [this] (http://stackoverflow.com/a/30466702/574479), thực hiện chính xác điều tương tự như mã của bạn làm. – biziclop

Trả lời

4

Cách đúng để làm những gì bạn muốn là:

Class.forName(className).asSubclass(MyClass.class); 
+0

Cảm ơn - và vui vẻ đủ, [nguồn OpenJDK cho phương pháp này] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/lang/Class. java # Class.asSubclass% 28java.lang.Class% 29) sử dụng '@ SuppressWarnings' và' isAssignableFrom' giống như trong đoạn mã thứ ba của tôi ở trên. Tôi không biết điều này trước khi đăng câu hỏi của mình. Tôi thấy thật vui khi các Generics Java bị phá vỡ đến mức chúng phải sử dụng '@ SuppressWarnings' trong mã nguồn riêng của chúng. – Kidburla

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