2013-10-07 6 views
1

Я хочу закодировать конструктор копирования для общего класса. У меня есть внутренний класс Node, который я собираюсь использовать в качестве узлов для двоичного дерева. Когда я перехожу в новый объектJava Generics Copy Constructor

public class treeDB <T extends Object> { 
    //methods and such 

    public T patient; 
    patient = new T(patient2);  //this line throwing an error 
    //where patient2 is of type <T> 
} 

Я просто не знаю, как в общем случае определить конструктор копии.

ответ

4

T не может гарантировать, что класс, который он представляет, будет иметь необходимый конструктор, поэтому вы не сможете использовать форму new T(..).

Я не уверен, если это то, что вам нужно, но если вы уверены, что класс объекта, который вы хотите скопировать будет иметь конструктор копирования, то вы можете использовать отражение как

public class Test<T> { 

    public T createCopy(T item) throws Exception {// here should be 
     // thrown more detailed exceptions but I decided to reduce them for 
     // readability 

     Class<?> clazz = item.getClass(); 
     Constructor<?> copyConstructor = clazz.getConstructor(clazz); 

     @SuppressWarnings("unchecked") 
     T copy = (T) copyConstructor.newInstance(item); 

     return copy; 
    } 
} 
//demo for MyClass that will have copy constructor: 
//   public MyClass(MyClass original) 
public static void main(String[] args) throws Exception { 
    MyClass mc = new MyClass("someString", 42); 

    Test<MyClass> test = new Test<>(); 
    MyClass copy = test.createCopy(mc); 

    System.out.println(copy.getSomeString()); 
    System.out.println(copy.getSomeNumber()); 
} 
+0

Будет ли метод clone() лучше в этот момент? Или вы порекомендуете то, что предложили? – morganw09dev

+0

@MorganK Это зависит от меня. Если вы хотите создать инструмент только для классов, которые реализуют 'Cloneable', то использование' 'и' original.clone() 'должно работать. Но так как ваш вопрос касается конструктора копирования (что предпочтительнее «clone»), я написал ответ, который будет делать то, что вы хотите, основываясь на размышлении. – Pshemo

+0

Хорошо. Спасибо. Ваши предложения помогли. – morganw09dev