Java中的对象切片

Java中的对象切片,java,type-slicing,Java,Type Slicing,你能不能把一个子类对象转换成一个与父类类型相同的对象,同时分割所有不属于父类的字段 我知道你可以在C++中完成这一点,但是我不知道如何在java中实现。 你不能改变java中对象的运行时类型(尽管你可以给超类型分配一个引用和对象,然后再转换成一个子类型)。您需要构造一个超类运行时类型的新对象 我通常建议所有类都应该是抽象类或叶类(概念上是final,如果出于实用原因没有实际标记为抽象类或叶类)。Java中没有直接的切片模拟,但我相信您可以通过向父级或子级添加一个成员函数来模拟这一点,该函数将为您

你能不能把一个子类对象转换成一个与父类类型相同的对象,同时分割所有不属于父类的字段


<>我知道你可以在C++中完成这一点,但是我不知道如何在java中实现。

你不能改变java中对象的运行时类型(尽管你可以给超类型分配一个引用和对象,然后再转换成一个子类型)。您需要构造一个超类运行时类型的新对象


我通常建议所有类都应该是抽象类或叶类(概念上是
final
,如果出于实用原因没有实际标记为抽象类或叶类)。

Java中没有直接的切片模拟,但我相信您可以通过向父级或子级添加一个成员函数来模拟这一点,该函数将为您创建一个新的父级实例。

尝试以下方法:

class Parent {
    private int fieldA;

    Parent(int fieldA) {
        this.fieldA = fieldA;
    }

    Parent(Parent object) {
        this.fieldA = object.fieldA;
    }
}

class Child extends Parent {
    private int fieldB;

    Child(int fieldA, int fieldB) {
        super(fieldA);
        this.fieldB = fieldB;
    }
}

然后您可以执行类似于
Parent-Parent=新父(子)的操作我没有在Java中看到类型切片。我不认为有太多的需要它

您可以在Java中随时执行此操作

Object x = new String("hello");

在这里,您将不会拥有String类提供的所有函数

我不确定为什么要这样做,但您可以让两个类实现相同的接口,然后通过接口引用对象。例如:

A类实现了一些东西…
类实现了一些东西


“分割不属于父类的字段”到底是什么意思?这听起来像是一个简单的工作。OP的意思是创建一个父类的实例,它的成员变量值与子实例中的成员变量值相同。所有“新”子实例变量都已被切掉。对象切分引用-为什么需要这样做?如果我理解这个问题,一种技术是在父类中实现复制构造函数。然后,您可以使用任何子类调用该构造函数,它将生成一个作为父类类型的副本。@nicerobot:如果该技术存在,并且具有一个可接受的名称和一个漂亮而详细的Wikipedia条目,那么它可能在某些情况下被证明是有用的。如果您能够判断Java是否支持对象切片,而不是询问OP的需求,那就太好了。一切都是抽象的还是最终的?这听起来有点极端。为什么你要所有的类都是抽象的或叶子的?我不遵守那个特定的咒语,但在实践中,我发现似乎无论如何都是这样。正如约书亚·布洛赫(Joshua Bloch)所说,“要么计划延期,要么禁止延期”。所有抽象类或最终类都是这种哲学的逻辑极端。
abstract^final
不应该流行。它应该对你的代码有好处。@汤姆:Scott Meyers也给出了这样的建议:“使非叶类抽象”。在更有效的C++中。true,但是你仍然会得到任何被重写的对象方法的字符串版本。“java”不是,而且从来没有,是一个缩写词。但是:你可以做一些事情,比如“代码>对象O=新字符串(Hello));字符串s=(字符串)o为什么投否决票,这将有效地满足人们的要求。让B类扩展A。然后你可以有:A A=新的A();B=新的B();然后你可以这样做:s1=a;s2=b;您也可以只做(如果B扩展了A):A tmp=B;只是为了进一步分类myParent{//myParent字段此处为myParent(T some子孙后代){//copy only fields visible to myParent here}
something = new A();    
something = new B();