簡體   English   中英

如何在Java類層次結構中實現泛型類型安全的深度克隆?

[英]How to implement generic type-safe deep cloning in a Java class hierarchy?

我有一個基類,比如Base ,它指定了抽象方法deepCopy ,以及無數的子類,比如說ABC ,...... Z 如何定義deepCopy ,使其簽名為每個類X public X deepCopy()

對,現在,我有:

abstract class Base {
  public abstract Base deepCopy();
}

不幸的是,這意味着,如果,如果我有從子類的對象,說aA ,然后我總是有一個更具體的深層副本執行未經檢查的轉換:

A aCopy = (A) a.deepCopy();

有沒有辦法,也許使用泛型,以避免施法? 我想保證任何深層副本都返回同一運行時類的對象。

編輯:讓我擴展我的答案,因為協變打字是不夠的。 說,然后我想實現一個方法,如:

static <N extends Base> List<N> copyNodes(List<N> nodes) {
    List<N> list = Lists.newArrayList();
    for (N node : nodes) {
      @SuppressWarnings("unchecked")
      N copy = (N) node.deepCopy();
      list.add(copy);
    }
    return list;
  }

我怎么能避免未經檢查的警告?

Java 5支持協變返回類型,這意味着您可以在每個子類中實現deepCopy()方法以返回特定的子類實例; 例如

public class Z extends Base {
  @Override
  public Z deepCopy() {

  }
}

更多關於協變返回類型的信息

這真的不太漂亮,我可能不會自己做,但是:

    public abstract class Base<T extends Base<T>> {
    public abstract T deepCopy();
}
public class Extender extends Base<Extender> {

    @Override
    public Extender deepCopy() {
        // TODO Auto-generated method stub
        return null;
    }
}

要么....

    public abstract class Base<T extends Base<T>> {
    public abstract T deepCopy();
}
public class Extender<T extends Base<T>> extends Base<T> {

    @Override
    public T deepCopy() {
        // TODO Auto-generated method stub
        return null;
    }
}

怎么樣...

public interface DeeplyCloneable <T extends Cloneable> {
    public T deepClone();
}

然后......例如......(有錯誤,但有好意;有幫助!)

public class DeeplyClonableHashTable

         <T1 extends DeeplyCloneable<?>,T2 extends DeeplyCloneable<?>> 
extends Hashtable<T1,T2>
implements DeeplyCloneable<Hashtable<T1,T2>>{

@Override
public Hashtable<T1, T2> deepClone() {
  Object o = super.clone();
  if ((o == null) || (! (o instanceof DeeplyClonableHashTable<?,?>)))
  {
    throw new DeepCloneException(
      "Object instance does not support deepCloneing.");
  }

  @SuppressWarnings("unchecked")
  DeeplyClonableHashTable<T1,T2> copy = (DeeplyClonableHashTable<T1,T2>)o;
  Set<T1> keys = copy.keySet();

  for (T1 key: keys){
    T2 value = this.get(key);
    T1 keyCopy = key.deepClone();  // this line is in error
    T2 valueCopy = value.deepClone();  // this line is in error
    copy.put(keyCopy, valueCopy);
  }
  return copy;
  }
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM