我有一个基类,例如Base,它指定了抽象方法deepCopy,还有许多子类,例如A,B,C,... Z。如何定义deepCopy,以便每个类public X deepCopy()的签名为X?
现在,我有:
abstract class Base {
public abstract Base deepCopy();
}
不幸的是,这意味着,如果我有一个子类的对象,例如a的A,那么我总是必须执行未经检查的强制转换以获取更具体的深层副本:
A aCopy = (A) a.deepCopy();
有没有办法避免使用强制转换?我想保证任何深层副本都返回相同运行时类的对象。
编辑:让我扩展我的答案,因为协变类型是不够的。说,然后我想实现一个类似的方法:
static List copyNodes(List nodes) {
List list = Lists.newArrayList();
for (N node : nodes) {
@SuppressWarnings("unchecked")
N copy = (N) node.deepCopy();
list.add(copy);
}
return list;
}
如何避免未经检查的警告?
java大神给出的解决方案
Java 5支持协变返回类型,这意味着您可以在每个子类中实现您的deepCopy()方法以返回特定的子类实例。例如
public class Z extends Base {
@Override
public Z deepCopy() {
}
}
有关协变返回类型here的更多信息。
java:继承 - java
有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…Java-如何将此字符串转换为日期? - java
我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…如何使用BorderLayout(Java)扩展JTextField - java
我有一个Java程序,其中使用的是JTextField,但如果我未指定默认大小,则其宽度为0。我将其插入BorderLayout中,因此如何制作它展开以填充整个容器? java大神给出的解决方案 在上面的示例中,文本字段将正常工作。但是,如果您插入EAST或WEST,则将不起作用。import java.awt.BorderLayout; import ja…查看抽象类的方法是否未被扩展类之一覆盖的方法 - java
我有一个抽象类,比如AbstractClass和扩展该抽象类的多个其他类(700多个)。 AbstractClass有一个方法,比方说baseMethod(),它不是抽象方法。许多类(500+)覆盖该方法并具有自己的实现。现在,通过eclipse,我可以很容易地看到通过Ctrl+Shift+G覆盖该方法的方法,但是除了手动以外,还有其他方法可以看到不覆盖该方…从较小的字节数组(Java)进行长时间转换 - java
我正在尝试将字节数组转换为long,但是接收到BufferUnderflowException ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES); byte[] arg1 = new byte[] {0x04, (byte)0xB0}; buffer.put(arg1, 0, arg1.length); …