将父类转变为子类

时间:2018-10-21 18:20:05

标签: java class casting

情况:

class A {
    private int prop = 0;
}
class B extends A {
    private int extraProp;
    B(int param){
        extraProp = param
    }
}

如您所见,唯一的不同是为B引入了一个额外的属性。

我基本上希望能够将多余的属性添加到A,同时将其转换为B。

是否可以不将所有属性从A类手动复制到B? 像这样

class B extends A {
    private final int extraProp;
    B(int param){
        extraProp = param
    }

    static B from(A a, int param){
        B b = new B(param);
        b.prop = a.prop;
        return b;
    }
}

这里我基本上是在上课。是否可以使用A的实例并简单地添加新道具,所以我不必担心手动克隆

我知道,仅通过在A上附加属性是可选的,这是可能的,但是我认为这不是一个好的解决方案。

A a = new A();
B atoB = (B /* WITH NEW PARAM */) A

1 个答案:

答案 0 :(得分:3)

Java不允许您这样做,这是有充分理由的。 Java的主要功能之一是其强大的静态类型系统。有关类定义的所有信息(字段,方法,可见性等)都在编译时决定,以后不能更改。例如,创建类时

class A {
    private int prop1;
    private int prop2;
}

那么无论何时您使用new A()创建一个实例,该实例都是完全按照您在代码中给出的规范构造的,即它的类型为A并具有两个私有字段{{1} }和prop1,仅此而已(当然除了prop2中的属性之外)。如果您创建B类

Object

您可以使用class B extends A { private int extraProp; } 创建具有A属性和new B()额外属性的实例。但是,即使B扩展了BAA还是不同的类型。您不能将B的现有实例“扭曲”到类A的实例中。像JavaScript这样具有可变原型的语言可能会实现这种效果,但是在Java中,类信息在编译时是固定的,这根本是不可能的。

您所能做的就是获取B的属性,并创建具有相同属性的A的新实例。但是实际上不可能将现有对象的类更改为其子类之一。