これはおそらく何百万回も前に尋ねられていますが、バインドされた型パラメータを持つ抽象クラスにコピーコンストラクタを書き込むのは難しいです。 Foo
とBar
の両方のためのcopy
方法は、変数の型を除いて同じであるので、私は具体的な方法にそのコードを移動できるようにしたいのですが、ジェネリックのJavaコピーコンストラクタ
public abstract class Superclass<T> {
Set<? extends Variable<T>> vars;
public abstract Superclass<? extends T> copy();
class Variable<T> {
T value;
}
}
class Foo extends Superclass<Integer> {
public Foo copy() {
Foo _newFoo = Foo();
Set<FooVariable> _newVars = new HashSet<FooVariable>();
_newVars.addAll(this.vars);
_newFoo.vars = _newVars;
}
class FooVariable extends Variable<Integer> { /* ... */ }
}
class Bar extends Superclass<String> {
public Bar copy() {
Bar _newBar = Bar();
Set<BarVariable> _newVars = new HashSet<BarVariable>();
_newVars.addAll(this.vars);
_newBar.vars = _newVars;
}
class BarVariable extends Variable<String> { /* ... */ }
}
:私はこのようになりますいくつかのコードを持っていますスーパークラス。しかし、私は、(a)はFoo
とBar
インスタンスで呼び出された場合Bar
に呼び出された場合、具体的なpublic Superclass<? extends T> copy
方法はFoo
インスタンスを返すようにする方法と、(b)FooVariable
SまたはBarVariable
のようにvars
セットに移入を把握することはできません適切な。
誰かが助けてくれて、私に何が欠けているか教えてください。ありがとう。
コピーコンストラクタは、クラスのインスタンスを引数として受け入れる実際のコンストラクタです。これはもっとコピー方法です。 –
これは 'Foo _newFoo = Foo();'でコンパイルエラーが発生し、欠落している戻り値の型はどうですか?または私はいくつかの概念を完全に誤解しています – exexzian