gpt4 book ai didi

java - 将父类变形为子类

转载 作者:行者123 更新时间:2023-11-30 07:43:56 25 4
gpt4 key购买 nike

情况:

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 的实例并简单地添加新的 Prop ,所以我不必担心手动克隆

我知道只要让 A 上的额外属性是可选的,这可能是可能的,但我认为这不是一个好的解决方案。

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

最佳答案

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

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

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

class B extends A {
private int extraProp;
}

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

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

关于java - 将父类变形为子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52918457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com