我得到以下信息:
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
感谢您的帮助!
最佳答案
Java不支持这个。您可以利用多态性将 B
的实例视为 A
的实例,但反之则不然。
您不能这样做的原因是因为没有类型安全的方法来保证您的 A
实例实际上是 B
的实例(您可以强制转换实例,但即使你这样做了,你也只能保证自己在执行时出现异常)。
判断类型之间是否存在类型安全的多态关系的最佳方法是测试此语句的有效性:
Any instance of some type is an instance of some other type.
例如:
Any instance of Dog is an instance of Mammal.
Any instance of Mammal is an instance of Dog.
请注意,第一个示例为 true,而第二个示例为 false。您在代码示例中尝试做的事情就像尝试将任何哺乳动物视为狗一样 - 尽管有时可能是正确的,但绝对不是正确的,这意味着编译器将不允许这样做。
同样,当它可能为真时,您必须强制转换引用,但这会在执行时引发异常。上面的具体示例就是发生异常的情况之一,因为我们可以清楚地看到您已经实例化了 A
类型的实例。
关于java - Java 中类似指针的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2608037/