2012-03-19 93 views
2

如果你有两个不同的类A和B,B是A的子类,如下所示,你可以不投:自定义对象铸造方法

A a = new A(); 
B b = new B(); 
A newA = (A)b; 

有没有一种方法,使上面的代码工作(没有更改上述代码)没有JVM抛出ClassCastException?

------------编辑----------

对不起,我在上面的问题的代码犯了一个错误。正确的版本如下:

A a = new A(); 
B b = new B(); 
B newB = (B)a; 
+0

'class B extends A {}',对吧?即使没有演员也应该工作。 – 2012-03-19 18:38:31

+0

在任何需要调用“A”类型的对象的情况下,“B”类型的对象都是可行的替代品,不需要强制转换。 – 2012-03-19 18:39:02

+0

@OliCharlesworth它可能会使dscer工作的上下文...这只是一个简单的例子 – 2012-03-19 18:39:21

回答

2

我想你可以简单地分配:

A newA = b; 
4

B已经有一个是,一个关系A。你不需要施放它......你可以用期望/指向A的任何方法或引用来抛出B。

根据您的编辑 - 如果您想要这样做,您的设计出现问题。虽然Bis-aA,相反的是不是是真的。 A不是B。换句话说,由于B延伸了A,它可能有方法/属性在A上没有定义。如果您将A转换为B,那么接受该引用的方法可能会尝试调用它认为在该实例上的方法,因为您告诉编译器它有一个B,实际上,底层的A没有要求方法。

在这里铸造只会导致疼痛和失败。

2

如果BA子类上面应该工作,和演员是不必要的:

A a = new A(); 
B b = new B(); 
A newA = b; // no need to cast! 
1

有了新的代码,不,你不能这样做。你必须创建一个新的对象:

B newB = new B(a); 

B newB = B.of(a); 

非抽象的非叶类一般应避免反正。此外,自1.5(2004年发布)以来,应该没有太多的演绎语法。