Tôi chỉ học được về vấn đề này fine looking syntaxLàm thế nào để có được loại chung loại khi không có tham số của nó?
Collections.<String>emptyList()
để có được một sản phẩm nào List
với các yếu tố đó được cho là loại String
. nguồn Java trông như thế này:
public static final List EMPTY_LIST = new EmptyList<Object>();
:
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
Bây giờ nếu tôi mã một phương pháp theo cách đó mà loại generic không xuất hiện trong danh sách tham số, có cách nào làm thế nào tôi có thể truy cập vào các lớp học thực tế đó trở thành T
?
tôi nói, đến nay cách tiếp cận của tôi để mã điều tương tự có thể đã được
private <T> T get(String key, Class<T> clazz) {
// here I can do whatever I want with clazz, e.g.:
return clazz.cast(value);
}
Nếu tôi loại bỏ các clazz
-parameter tôi sẽ không thể làm cast()
. Rõ ràng tôi có thể làm
return (T) value;
nhưng điều đó mang lại cho tôi cảnh báo thông thường Type safety: Unchecked cast from Object to T
. Ok, @SuppressWarnings("unchecked")
giúp ở đây, nhưng thực sự tôi muốn làm điều gì đó với kiểu trả về dự định của phương thức. Nếu tôi thêm biến cục bộ
T retValue;
Tôi phải khởi tạo nó bằng một cái gì đó, null
không giúp ích gì. Sau khi tôi chỉ định nó như
@SuppressWarnings("unchecked")
T retValue = (T) value;
Tôi có thể làm, ví dụ:
retValue.getClass().getName()
nhưng nếu diễn viên không thành công, tôi sẽ không có thông tin về số T
nữa.
Vì Java (hoặc ít nhất là Java 6 của tôi) không có thông tin chung nữa trong thời gian chạy, tôi hiện không thể nghĩ ra cách để thực hiện việc này. Là có một cách? Hay tôi phải gắn bó với cách tiếp cận "cũ" của tôi ở đây?
Xin lưu ý rằng ví dụ tôi xếp hàng rất đơn giản và không có ý nghĩa nhiều. Tôi muốn làm những thứ phức tạp hơn ở đây, nhưng đó là ngoài phạm vi.
trông giống như một bản sao của [câu hỏi này] (http://stackoverflow.com/questions/2434041/instantiating-generics-type-in-java) –
@NitzanVolman: Ở một mức độ nhất định bạn là đúng, nhưng không phải hoàn toàn. – sjngm