2

Base抽象メソッドを指定する基本クラスと、、、 ...deepCopyなどの無数のサブクラスがあります。その署名が各クラスに対応するように定義するにはどうすればよいですか?ABCZdeepCopypublic X deepCopy()X

さて、今、私は持っています:

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

未チェックの警告を回避するにはどうすればよいですか?

4

3 に答える 3

5

Java 5は共変リターン型をサポートしています。つまり、各サブクラスにメソッドを実装してdeepCopy()、特定のサブクラスインスタンスを返すことができます。例えば

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

  }
}

共変リターンタイプの詳細については、こちらをご覧ください。

于 2009-09-03T21:57:46.207 に答える
2

これは本当にきれいではありません。おそらく自分ではやらないでしょうが、

    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;
    }
}
于 2009-09-04T08:41:34.757 に答える
1

どうですか...

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;
  }
} 
于 2011-11-12T05:21:26.783 に答える