【问题标题】:Warping parent class into child class将父类扭曲为子类
【发布时间】:2019-03-25 21:15:39
【问题描述】:

情况:

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

【问题讨论】:

  • 对不起,你的问题很不清楚。你能提供一个你正在尝试做什么的例子吗?
  • static final int INT_CONSTANT类常量。这意味着B 类的每个 实例都共享同一个int 字段。
  • @NicholasK 再次检查,我想我已经尽可能清楚了
  • @zlakad 可能是一个错字,已经消失了

标签: java class casting


【解决方案1】:

Java 不允许您这样做,这是有充分理由的。 Java 的关键特性之一是其强大的静态类型系统。关于类定义的所有内容(字段、方法、可见性等)都是在编译时决定的,之后无法更改。例如当你创建一个类时

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

然后,无论何时您使用new A() 创建实例,该实例都完全根据您在代码中提供的规范构造,即它的类型为A,并且恰好有两个私有字段prop1prop2,没有别的(当然除了Object 中的属性)。如果你创建一个 B 类

class B extends A {
    private int extraProp;
}

您可以使用new B() 创建具有A 属性和B 额外属性的实例。但即使B 扩展AAB 是不同的类型。您不能将A 的现有实例和“变形”放入B 类的实例中。类似的事情在 JavaScript 这样具有可变原型的语言中是可能的,但在 Java 中,类信息在编译时是固定的,这是不可能的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多