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());
}
Будет ли метод clone() лучше в этот момент? Или вы порекомендуете то, что предложили? – morganw09dev
@MorganK Это зависит от меня. Если вы хотите создать инструмент только для классов, которые реализуют 'Cloneable', то использование' 'и' original.clone() 'должно работать. Но так как ваш вопрос касается конструктора копирования (что предпочтительнее «clone»), я написал ответ, который будет делать то, что вы хотите, основываясь на размышлении. –
Pshemo
Хорошо. Спасибо. Ваши предложения помогли. – morganw09dev