将超类对象转换为子类对象

4
我有一些像这样的代码。
超级类
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);
    }
}

但是它给出了“类转换异常”。

1
发布异常跟踪 - Abimaran Kugathasan
4
您提供的代码片段不会抛出ClassCastException异常。 - Radiodef
你的代码中没有将超类转换为子类。你在哪里得到了ClassCastException? - TheLostMind
你的代码运行良好,没有任何异常的可能性。 - Yagnesh Agola
有一个异常,让我发布它。 - Kishan Bheemajiyani
6个回答

7
您可以将子类转换为超类,但不能反过来。 如果Vehicle是超级类,而Car是子类,则所有的汽车(子类)都是车辆(超类),但不是所有的车辆都是汽车。

:) i Geld to have ans - Kishan Bheemajiyani

3

我能把超类的对象转换为子类吗?

不行,你只能反过来做。你只能把子类对象分配给超类引用。

原因是子类可以具有更多功能和更具体的问题解决方法。如果允许将超类对象转换为子类,则超类对象将如何获得这些子类功能呢?


2

没有可能这样做。你只能有类似以下的东西:Actual s = new Super();或者Super sp = new Super();或者Actual a = new Actual();除此之外就没有其他可能性了。只有这种方式赋值才不会抛出ClassCastException异常。


如何实现 Super s = new Actual(); - Yagnesh Agola
拼写错误。我进行了更改。 - RMachnik
我在我的答案中进行了更改,因为我误读了问题。我以为Super是一个基类,而Actual是扩展Super类的。所以我的错误在于,Super s = new Actual将无法编译。我对我的答案进行了更改,请再次阅读。你会看到它的变化。 - RMachnik
@Rafik991 兄弟,你可以给出那个超类的引用,但不能使用子类来创建该对象。你不能使用那个超类对象访问子类的 Int y。 - Kishan Bheemajiyani
你的回答不错,加一分。但是这并不是我想要的最佳答案。 - Kishan Bheemajiyani
谢谢:),那我的回答可以被接受吗?提前感谢。 - RMachnik

1
这些是创建您的超类和子类对象的唯一方式:
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


如果您将实际类创建为超类对象,那么您能否通过此实际对象访问超类的整数? - Kishan Bheemajiyani
你的回答很棒,加一分! - Kishan Bheemajiyani
也许这个链接可以帮助理解:http://www.xyzws.com/Javafaq/what-is-variable-hiding-and-shadowing/15 - Yagnesh Agola
我得到了正确的答案,你的答案也是正确的,但不是我所问的,它接近于我的问题 :) - Kishan Bheemajiyani

0

在编程中,有几种情况需要将一个对象向下转型。但这是不可能的。但您可以始终使用超类对象创建一个新的子类对象。您的子类可以有一个构造函数,该构造函数以超类对象作为参数。

class A {

    int a = 0;
}

class B extends A{      

    int b = 0;

    public B(){

    }
    public B( A ao){            
        
        super.a = ao.a;
    }
}

0

从逻辑上讲,这是不可能的,因为每个子类都有添加属性到其从父类继承的属性之上的特权,最终导致不同的数据结构。在向上转型(将子类强制转换为超类)时,添加的属性被简单地忽略,但基本属性仍然存在,因此可以进行强制转换。但是,在向下转型(超类到子类)时,超类根本不适合于子类的类数据结构,最终导致类转换异常。 尽管如此,有一个技巧可以实现将一个类转换为另一个类(从子类到超类和反之亦然),但计算方面可能会有一些开销, 是的,对象映射使其成为可能。以下是代码:

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

即使一个类与其他类没有关系,这仍然是正确的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接