Bên cạnh những vấn đề của loại tẩy xoá - mà làm cho không thể này trong mọi trường hợp - bạn đơn giản là không thể đảm bảo rằng T
đã một tiếp xúc, không có hàm tạo đối số!
Cách giải quyết truyền thống là di chuyển xung quanh đối tượng nhà máy cung cấp các phương pháp có thể được sử dụng để lấy các đối tượng T
. Một ví dụ đơn giản sẽ là
interface Factory<T> {
T create();
}
và sau đó lớp học của bạn có thể nhận được một Factory<T>
và gọi create()
vào nó để lấy thêm T
s. Ví dụ phức tạp hơn có thể yêu cầu các đối số bổ sung cho phương thức create
, ví dụ hoặc quá tải.
Cách giải quyết ít tốn kém bao gồm phản ánh rõ ràng, đi qua các đối tượng Class<T>
. Ví dụ: ArrayList.class.newInstance()
trả về một số nguyên liệu mới được xây dựng ArrayList
. Bạn phải chuyển một cách rõ ràng xung quanh đối tượng Class
và cách tiếp cận dựa trên phản chiếu chậm hơn một hàm tạo thông thường hoặc một đối tượng nhà máy (mặc dù tốc độ phản chiếu đã được cải thiện gần đây). Bạn cũng phụ thuộc vào lớp để lộ một hàm tạo no-arg, không phải lúc nào cũng vậy. Nó có thể được thực hiện để làm việc, nhưng nó không bao giờ những gì tôi muốn gọi là "dễ chịu."
(Điều đó nói rằng, để tham khảo, có dấu hiệu cho thấy tình hình có thể thay đổi đôi chút trong Java 8 với dự án Lambda và bạn bè.)
Nguồn
2012-05-31 09:30:22
thể trùng lặp của [Tạo thể hiện của loại chung trong Java?] (http://stackoverflow.com/questions/75175/create-instance-of-generic-type-in-java) – pingw33n
bạn nói đúng. hoàn toàn bị bỏ qua rằng – nux