clone()不可见

时间:2012-05-23 09:00:58

标签: java generics clone

我有一个班级:

public class CounterBag<T extends Additive<T> & Cloneable & Serializable> {
    private T cntData;

    // c'tor, accessors equals and hashcode... 
    public T getCounterData() {
       return cntData;
    }
}

其他班级Service的成员类型为Set<CounterBag>。 现在在Service内我想要查找特定的CounterBag并返回其cntData成员的克隆。

当在Service类的查找方法内部时,我检测到集合中CounterBag的实例并尝试以下内容:

return counterBag.getCounterData().clone();

clone()似乎不可见。

我想知道需要做些什么来使clone()可见?

3 个答案:

答案 0 :(得分:2)

Cloneable没有(重新)声明clone方法,它只是继承自Object。这意味着T的实例未知具有clone的可见实现。定义自己的Cloneable子接口,声明clone并将其用作T的边界。如果你不能,因为你无法控制各种具体的T,那么你将不得不求助于反思。 :(

答案 1 :(得分:1)

clone方法默认在Object类中定义,并且是该类的protected成员。

来自Object课程:

protected native Object clone() throws CloneNotSupportedException;

因此,您必须在clone课程中定义CounterBag方法。然后只有它可用。

public Object clone() throws CloneNotSupportedException {
    return super.clone();
}

您必须将其定义为公共方法,以使其在包中可用。

答案 2 :(得分:1)

确保作为T类型参数传递的类以适当的可见性实现Cloneable,例如:

@Override
public Object clone() {
    try {
        return super.clone();
    } catch (Exception e) {
        // either handle the exception or throw it
        return null;
    }
}

请记住,protected类中的clone() 方法标记为Object,您需要在自己的类中显示它。

相关问题