情况:
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
答案 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
扩展了B
,A
和A
还是不同的类型。您不能将B
的现有实例“扭曲”到类A
的实例中。像JavaScript这样具有可变原型的语言可能会实现这种效果,但是在Java中,类信息在编译时是固定的,这根本是不可能的。
您所能做的就是获取B
的属性,并创建具有相同属性的A
的新实例。但是实际上不可能将现有对象的类更改为其子类之一。