2012-05-31 33 views
8

Tôi bị kẹt. Đến từ C++ Tôi nghĩ rằng điều này sẽ chỉ đơn giản là làm việc, nhưng nó không. Bạn có thể cho tôi lời khuyên không? Tôi sẽ cố gắng để không kết thúc với loại phương pháp sáng tạo trong mỗi lớp sử dụng cho T.Khởi tạo loại chung trong java

public class A<T>{ 

    private T t_; 

    public A(){ 
     t_ = new T(); //error 
    } 

} 

Ngoài ra tôi không muốn có constructor trông như: A (Lớp classT) {... Lý tưởng nhất là tôi muốn có một cái gì đó như mã C++ này.

template<class T> 
class A{ 
private: 
    T t_; 

public: 
    A(){} 

}; 

Cảm ơn bạn đã trợ giúp.

+0

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

+0

bạn nói đúng. hoàn toàn bị bỏ qua rằng – nux

Trả lời

5

Xin lỗi bạn đã thất vọng nhưng điều này chỉ đơn giản là không thể trong java mà không có nhà thầu.

Java ném đi những thông tin chung chung trong thời gian chạy (xem loại tẩy xoá)

11

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è.)

+0

Cảm ơn gợi ý. Có vẻ như tôi phải làm theo cách đó: / – nux

0

thử điều này:

private <E extends ISomething> E createInstance(Class<E> clazz) { 
     E ret; 
     try { 
      ret = clazz.newInstance(); 
      ret.setSomething(something); 

     } catch (InstantiationException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
     return ret; 
    } 
Các vấn đề liên quan