2

您能否获取一个子类对象并以某种方式将其转换为与父类相同类型的对象,同时对所有不属于父类的字段进行切片?

我知道你可以在 C++ 中做到这一点,但我不知道如何在 Java 中做到这一点。

4

5 回答 5

5

您不能在 Java 中更改对象的运行时类型(尽管您可以将引用和对象分配给超类型,并转换回子类型)。您需要构造一个超类运行时类型的新对象。

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

于 2010-03-25T18:27:21.267 回答
4

试试这个:

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 = new Parent(child);,你会得到想要的结果,但正如其他人评论的那样,这不是转换,而是构造一个全新的对象。

于 2010-03-25T18:29:38.813 回答
0

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

于 2010-03-25T18:28:43.400 回答
0

我还没有在 Java 中看到类型切片。而且我认为没有太多需要...

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

Object x = new String("hello");

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

于 2010-03-25T18:37:20.773 回答
-1

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

A类实现了一些东西......
B类实现了一些东西......

something = new A();    
something = new B();
于 2010-03-25T18:45:15.613 回答