Morgan Kenyon
Morgan Kenyon

Reputation: 3172

Java Generics Copy Constructor

I'm wanting to code a copy constructor for a generically defined class. I have an inner class Node, which I am going to use as the nodes for a binary tree. When I pass in a a new Object

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>
}

I just don't know how to generically define a copy constructor.

Upvotes: 5

Views: 4168

Answers (1)

Pshemo
Pshemo

Reputation: 124225

T can't guarantee that class it represents will have required constructor so you can't use new T(..) form.

I am not sure if that is what you need but if you are sure that class of object you want to copy will have copy constructor then you can use reflection like

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());
}

Upvotes: 9

Related Questions