【发布时间】:2013-06-25 18:09:32
【问题描述】:
这可能已经被问过一百万次了,但是我很难在一个带有有界类型参数的抽象类上编写一个复制构造函数。我有一些看起来像这样的代码:
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> { /* ... */ }
}
由于Foo 和Bar 的copy 方法除了变量类型外是相同的,我希望能够将该代码移动到超类中的具体方法中。但我无法弄清楚(a)如果在Foo 上调用具体的public Superclass<? extends T> copy 方法,如何返回Foo 实例,如果在Bar 上调用Bar 实例,以及(b)填充vars 设置为 FooVariables 或 BarVariables 视情况而定。
有人可以帮忙告诉我我缺少什么吗?谢谢。
【问题讨论】:
-
复制构造函数是一个实际的构造函数,它接受类的实例作为参数。这更像是一种复制方法。
-
不会在这些
Foo _newFoo = Foo();上给出编译错误,那么缺少的返回类型呢?或者我完全误读了一些概念