Có thể phản ánh nhanh một loại chung trong Java không? Sử dụng kỹ thuật được mô tả here Tôi gặp lỗi vì mã thông báo lớp học không thể là chung chung. Lấy ví dụ dưới đây. Tôi muốn khởi tạo một số lớp con của Creator để triển khai Creator. Tên lớp thực tế được truyền vào như một đối số dòng lệnh. Ý tưởng là để có thể chỉ định việc triển khai Trình tạo khi chạy. Có cách nào khác để hoàn thành những gì tôi đang cố gắng làm ở đây không?Tôi có thể phản ánh nhanh kiểu generic trong java không?
public interface Creator<T> {
T create();
}
public class StringCreator implements Creator<String> {
public String create() { return new String(); }
}
public class FancyStringCreator implements Creator<String> {
public String create() { return new StringBuffer().toString(); }
}
public static void main(String[] args) throws Exception {
Class<?> someClass = Class.forName(args[0]);
/*ERROR*/Class<? extends Creator<String>> creatorClass = someClass.asSubclass(Creator.class);
Constructor<? extends Creator<String>> creatorCtor = creatorClass.getConstructor((Class<?>[]) null);
Creator<String> creator = creatorCtor.newInstance((Object[]) null);
}
Chỉnh sửa: Tôi thích cách tiếp cận của Marcus là đơn giản nhất và thực dụng mà không phá vỡ toàn bộ điều. Tôi có thể sử dụng nó trong tình huống của mình vì tôi có thể chỉ định rằng lớp được truyền phải là một lớp con của StringCreator. Nhưng như Ericson đã chỉ ra các thông tin chung vẫn còn ở cấp độ loại, không phải ở cấp độ thời gian chạy nên vẫn có thể kiểm tra một cách phản xạ xem một lớp cụ thể có triển khai đúng kiểu generic hay không.
Không phải tất cả thông tin chung đều bị mất khi chạy; còn đủ để kiểm tra thông tin loại cần thiết ngay cả khi không tạo giao diện khác. Nó chỉ là không có đủ thông tin còn lại cho trình biên dịch để suy ra tính chính xác. – erickson
Bạn đang ở đó. Những gì tôi đã nói (một cách phức tạp) là không có đối tượng lớp nào đại diện cho Người sáng tạo khác biệt với Người sáng tạo . Nhưng mã của bạn được cắt dưới đây có vẻ như là một cách hợp lý để giải quyết vấn đề. –
Markus