将超类的对象转换为子类



我有一些这样的代码。

超级舱

public class Actual {
    public int x = 123;
}

子类

public class Super extends Actual{
    public int x = 999;
    public int y = 12345;
}

public class Sub extends Super {
    public int x = 144;
}

所以问题是我可以将超类的对象转换为子类吗?这是我尝试过的这个问题的正确吗?

public class Mid1Prob1 {
    public static void main(String[] args) {
        System.out.println("Testing...");
        int x = 3;
        Actual actual = new Super();
        System.out.println(actual.x);

        Super super1 = new Super();
        System.out.println(super1.x);

        Actual act = new Actual();
        act = new Sub();
        System.out.println(act.x);
    }
}

但它给了类演员例外。

您可以将子类强制转换为超级类,但反之则不然。如果车辆是超级类,汽车是子类,则所有汽车(儿童)都是车辆(超级),但并非所有车辆都是汽车。

我可以将超类的对象转换为子类吗?

不,您只能以其他方式执行此操作。只能将子类对象分配给超类引用。

原因是,子类可以具有更多的功能并且更具体地针对问题。如果允许您将超类对象与子类大小写,那么该超类对象将如何获得这些子类功能?

没有可能这样做。你只能这样拥有sth。 Actual s = new Super();Super sp = new Super();Actual a = new Actual(); 没有其他可能性。只有这种同义可能不会引发类播异常。

这些是创建超类和子类对象的唯一方法:

Actual act = new Actual();
Actual actual = new Super();
Actual actual2 = new Sub();
Super super1 = new Super();
Super super2 = new Sub();
Sub sub = new Sub();  

没有其他办法。如果您尝试过,它会给您编译时错误来转换您的类或给出运行时错误java.lang.ClassCastException

从逻辑上讲,这是不可能的,因为每个子类都有特权在它从其父类继承的属性之上添加属性,最终导致不同的数据结构。向上移动(将子类转换为超类)时,添加的属性被简单地忽略,但基本属性就在那里,因此可以进行转换。但是,当向下转换(超类到子类)时,超类根本不适合子类的数据结构,最终导致类转换异常。尽管如此,有一个技巧在计算方面可能有点昂贵,但可以将一个类转换为另一个类(子类到超类,反之亦然),是的,对象映射器使之成为可能。以下是代码:

**SuperClass sc=new SuperClass();
sc.attribute="";
ChildClass ch= new ObjectMapper().convertValue(sc,ChildClass.class);**

即使在一个类与其他类没有关系的情况下也是如此

几种情况需要向下投射对象。这是不可能的。但是您始终可以使用超类对象创建一个新的子类对象。你的子类可以有一个构造函数,它将超类对象作为 aurgument。

A类{

    int a = 0;
}
class B extends A{      
    int b = 0;
    public B(){
    }
    public B( A ao){            
        
        super.a = ao.a;
    }
}

最新更新