1

我有一堂课:

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

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

其他类Service有 type 的成员Set<CounterBag>。现在在里面Service我想查找特定CounterBag的并返回其cntData成员的克隆。

Service类的查找方法中,我检测到集合中的实例CounterBag并尝试以下操作:

return counterBag.getCounterData().clone();

clone()似乎不可见。

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

4

3 回答 3

2

Cloneable不(重新)声明该clone方法,它只是从Object. 这意味着T不知道 的实例具有可见的clone. 定义您自己的子接口,Cloneable其中声明clone并将其用作T. 如果你不能因为你无法控制各种具体T的 s,那么你将不得不诉诸反思。:(

于 2012-05-23T09:14:55.297 回答
1

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

Object班级:

protected native Object clone() throws CloneNotSupportedException;

所以,你必须在你的类中定义clone方法。CounterBag然后只有它可用。

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

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

于 2012-05-23T09:10:21.607 回答
1

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

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

请记住,该方法clone() 被标记为protectedObject类中,并且您需要使其在您自己的类中可见。

于 2012-05-23T09:10:49.160 回答