在下面的程序中我期待没有例外。使用go()方法中的go2
方法,我收到异常错误“Tree无法转换为Redwood”。
对我而言,这只是向下倾斜,应该是完全可以的。有人能帮我理解为什么会抛出异常吗?
class Tree{ }
class Redwood extends Tree {
void go()
{
go2(new Tree(), new Redwood());
go2( (Redwood)new Tree(), new Redwood());
}
void go2(Tree t1, Redwood r1)
{
Redwood r2 = (Redwood) t1;
Tree t2 = (Tree) r1;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new Redwood().go();
}
}
>> a similar program and this one works fine .
class Animal2 {
static void doStuff(){
System.out.println("a " );
}
}
class Dog extends Animal2{
static void doStuff(){
System.out.println("b ");
}
void playdead(){ System.out.print(" ccc" + "\n");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Animal2[] a= {new Animal2(), new Dog(), new Animal2()};
for(Animal2 animal : a)
{
animal.doStuff();
if(animal instanceof Dog)
{
((Dog) animal).playdead();
}
}
}
}
答案 0 :(得分:2)
红木是一种树。树不是一种红木,不仅仅是所有的动物都是猫。所以这不起作用:
(Redwood)new Tree()
但这会:
(Tree)new Redwood()
也许你打算这样做:
void go() {
go2(new Tree(), new Redwood());
go2(new Redwood(), new Redwood());
}
Java将在第二次调用中自动使用第二个红木作为go2
的树。
答案 1 :(得分:1)
我假设你的程序在go2( (Redwood)new Tree(), new Redwood());
失败了。考虑一下:根据您的继承关系,每个Redwood
(实例)也是Tree
的实例。但不是每棵树都是红木。
尝试将new Tree()
的结果转换为Redwood
必定会失败。对于所有虚拟机而言,它可能是一个桦树。
答案 2 :(得分:0)
我认为Redwood
继承自Tree
。您已经创建了Tree
的新实例 - 这不能转换为更具体的类型,因为它不是一个。一棵树不一定是红木。继承以另一种方式起作用 - (Tree)new Redwood()
完全有效,因为红木是树 - 这是继承中要记住的关键短语。
答案 3 :(得分:0)
您正在创建Tree
,然后尝试说服编译器它是Redwood
。它不是!
我通常不希望看到这样的演员。如果必须这样做,通常会建议您的对象建模不正确。
在上面的示例中,我希望Tree
是抽象的,并且您可以创建Redwoods
,Larchs
等。您将无法创建{{1}因为你需要创造特定的物种。方法的界面可能会以Tree
的形式进行讨论,因为Trees
是-a Redwood
。
答案 4 :(得分:0)
Redwood是Tree的一个子类,你试图从Tree转换为Redwood。这是不可能的,因为树不是红木。您可以将Redwood投射到树上,因为它也是一棵树。
答案 5 :(得分:0)
您无法将对象类A
强制转换为A
的某个子类B
的实例。