我有一个班级:
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()
可见?
答案 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
,您需要在自己的类中显示它。