0

我得到以下信息:

class A{  
    int foo;  
}  
class B extends A{  
    public void bar();  
}

我得到了一个 A 的实例,并希望将其转换为 B 的一个实例,而不会丢失对变量 foo 的引用。

例如:

A a = new A();  
a.foo = 2;  
B b = a; <-- what I want to do.  
//use b  
b.foo = 3;  
//a.foo should now be 3

谢谢你的帮助!

4

3 回答 3

4

Java 不支持这一点。您可以利用多态性来处理Bas 和 instance of 的实例,A但不能反过来。

你不能这样做的原因是因为没有类型安全的方法来保证你的实例A实际上是一个实例B(你可以强制转换实例,但即使你这样做了,你也只能保证自己在执行时出现异常) .

判断类型之间是否存在类型安全、多态关系的最佳方法是测试此语句的有效性:

某种类型的任何实例都是某种其他类型的实例。

例如:

Dog 的任何实例都是 Mammal 的实例。
Mammal 的任何实例都是 Dog 的实例。

请注意,第一个示例为真,而第二个示例为假。您在代码示例中尝试做的事情就像尝试将任何哺乳动物视为狗一样 - 即使有时它可能是正确的,但绝对不是正确的,这意味着编译器不会允许它。

同样,有时可能是真的,您必须强制转换引用,但这会在执行时为您打开异常。您上面的具体示例是发生异常的情况之一,因为我们可以清楚地看到您已经实例化了 type 的实例A

于 2010-04-09T13:59:51.770 回答
0

使用复制构造函数:

class B extends A{  
    public B(A a){
        this.foo = a.foo;
    }
}
于 2010-04-09T14:02:29.063 回答
0

你不能简单地做到这一点,因为变量的运行时类型a无论如何都会是A,而不是B

这意味着它a不会具有B..的特性,并且您无法通过演员获得它!

于 2010-04-09T14:05:56.147 回答