【问题标题】:Java Generics Copy ConstructorJava 泛型复制构造函数
【发布时间】:2013-10-13 12:18:21
【问题描述】:

我想为一个通用定义的类编写一个复制构造函数。我有一个内部类 Node,我将用它作为二叉树的节点。当我传入一个新对象时

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

我只是不知道如何定义一个复制构造函数。

【问题讨论】:

    标签: java generics copy-constructor


    【解决方案1】:

    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() 方法会更好吗?或者你会推荐你的建议吗?
    • @MorganK 这取决于。如果您只想为实现Cloneable 的类创建工具,那么使用&lt;T extends Cloneable&gt;original.clone() 应该可以工作。但是由于您的问题是关于复制构造函数(比clone 更可取),所以我发布了答案,可以根据反射做您想做的事情。
    • 好的。谢谢你。您的建议有所帮助。
    • @Pshemo:不,你不能。没有公开的clone() 方法。
    • 太棒了!正是我需要的。 +100
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    相关资源
    最近更新 更多