Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将父类扭曲为子类_Java_Class_Casting - Fatal编程技术网

Java 将父类扭曲为子类

Java 将父类扭曲为子类,java,class,casting,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 {

情况:

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 = new A();
B atoB = (B /* WITH NEW PARAM */) A

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

class A {
    private int prop1;
    private int prop2;
}
然后,每当您使用
new A()
创建实例时,该实例将完全按照您在代码中给出的规范构造,即它的类型为
A
,并且正好有两个私有字段,
prop1
prop2
,除
对象中的属性外,没有其他内容。如果你创建了一个B类

class B extends A {
    private int extraProp;
}
您可以使用
new B()
创建实例,这些实例的属性为A,额外属性为
B
。但是,即使
B
扩展了
A
A
B
是不同的类型。不能将
A
的现有实例“扭曲”到类
B
的实例中。类似的事情在JavaScript这样的语言及其可变原型中是可能的,但在类信息在编译时固定的Java中,这是不可能的


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

对不起,您的问题很不清楚。你能提供一个你想做什么的例子吗?
静态final int_常量
是类常量。这意味着类
B
的每个实例都共享同一个int字段。@请再次检查,我想我已经尽可能清楚地说明了这一点it@zlakad可能是打字错误,它不见了