我有一组类,这些类用于存储数据,目前我正在尝试实现一种深度复制机制。为此,我想在我的抽象类中定义一个方法deepCopy(),每个扩展类都需要实现这个方法。
我很难用泛型的方式定义抽象方法,以便每个deepCopy()都返回其实现的类的一个对象。
public abstract class Foo {
public abstract Foo deepCopy();
}
public class Bar extends Data {
@Override
public Bar deepCopy() {
//copying;
}
}这是我想要达到的目标,但最后我得到了这样的结果:
public abstract class Foo {
public abstract Foo deepCopy();
}
public class Bar extends Data {
@Override
public Foo deepCopy() {
//copying;
}
}这将导致调用deepCopy()时出现错误。
public SomeClass extends Foo {
private Bar value;
private SomeClass(final SomeClass original) {
this.value = original.deepCopy(); // type-mismatch since deepCopy returns Foo but value is Bar.
}
@Override
public Foo deepCopy() {
return new SomeClass(this);
}
}解决这一问题的最简单方法是将返回的deepCopy对象转换为Bar,但这似乎是错误的。
是否有一个干净的方法来实现这一点?
发布于 2014-03-19 13:45:48
在这里,协变返回类型似乎解决了这个问题:
public abstract class Foo {
public abstract Foo deepCopy();
}然后Bar可以从方法返回一个Bar:
public class Bar extends Foo {
@Override
public Bar deepCopy() {
//copying;
}
}所以:
final Bar bar = new Bar();
final Bar barCopy = bar.deepCopy(); // <- Bar's deepcopy returns a Bar
final Foo foo = ((Foo) bar).deepCopy(); // <- Foo's deepcopy returns a Foo这是允许的,因为作为Bar extends Foo,您可以在任何允许使用Bar的地方使用Foo。因此,子类可以重写来自返回协变量类型的超类的方法。
这将适用于更一般的情况:
public abstract class Foo {
public abstract Number getThing();
}
public class Bar extends Foo {
@Override
public Integer getThing() {
//copying;
}
}如您所见,Bar.getThing返回一个Integer,但它重写了返回Number的方法Foo.getThing。这很好,因为我们可以在任何可以使用Integer的地方使用Number。
发布于 2014-03-19 13:41:38
您可以使用java中的Generics来完成这一任务。
像这样实现类。
public abstract class Foo<Item> {
public abstract Item deepCopy();
}您可以在这里阅读有关泛型的http://docs.oracle.com/javase/tutorial/java/generics/。
https://stackoverflow.com/questions/22507700
复制相似问题