2012-05-07 38 views
6

tôi đang học Java của chung, tôi snag vào một số vấn đề instantiating loại nhận được từ các thông số chung chung (điều này là có thể trong C# mặc dù)instantiating chung của tham số

class Person { 
    public static <T> T say() { 
     return new T; // this has error 
    } 
} 

Tôi cố gắng này: generics in Java - instantiating T

public static <T> T say(Class<?> t) { 
    return t.newInstance(); 
} 

Lỗi:

Điều đó không hiệu quả. Sau đây trông ok, nhưng nó đòi hỏi phải instantiating một số lớp, không thể được sử dụng trên phương pháp tĩnh: Instantiating generics type in java

public class Abc<T> 
{ 

    public T getInstanceOfT(Class<T> aClass) 
    { 
     return aClass.newInstance(); 
    }  

} 

Đây là loại chô bôi Java folks đang nói gì không? Đây có phải là giới hạn của loại tẩy xoá không?

Sự cố xung quanh vấn đề này là gì?

Trả lời

8

Bạn đã rất thân thiết. Bạn cần thay Class<?> (có nghĩa là "một lớp học của bất kỳ loại") với Class<T> (có nghĩa là "một lớp kiểu T"):

public static <T> T say(Class<T> t) throws IllegalAccessException, InstantiationException { 
    return t.newInstance(); 
} 
+0

+1 và chấp nhận, không thanh lịch như C# mặc dù (không phải của bạn lỗi ;-)). Btw, đây có phải là cái mà họ gọi là loại xóa, đó là lý do tại sao nó không thể khởi tạo T một cách trực tiếp? – Hao

+1

@Hao: chính xác: loại T thực sự không có sẵn trong thời gian chạy, đó là lý do tại sao bạn cần phải vượt qua trong một đối tượng Lớp để làm cho nó rõ ràng. –

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