2014-04-03 12 views
0

我有以下情况。为什么在给定场景的编译时允许将基类转换为扩展类?

public class Fruit { 
    public Fruit() { 
    System.out.println("Fruit Constructor"); 
    } 

    public String callSuperApple() { 
    return "super fruit"; 
    } 
    } 


    public class Apple extends Fruit{ 
    private String color; 

    public String callSuperApple() { 
    return "super fruit"; 
    }  
    } 

还有一些第三类:

public class SomeClass{ 
    private String color; 

    public String callSuperApple() { 
     return "fruit"; 
    } 
    } 

现在主要方法的实现:

public class MainClass{ 

public static void main(String[] args) { 
    Fruit fruit= new Fruit(); 
    String string = (String)((Apple)fruit).callSuperApple();//line 3 
    System.out.println(string); 
} 
} 

在这里,我们在运行时异常,但不是编译时错误。

但当线3被改变为

String string = (String)((SomeClass)fruit).callSuperApple(); 

它将引发一个编译时间错误。方法callSuperApple()SomeClassFruit中实施。

现在,AppleFruit的一种类型,但是我们能够反转类型转换fruitApple。 TypeCasting AppleFruit有意义,但不是相反。为什么在编译时允许这样做,并且SomeClass仅在编译时捕获?

回答

0

铸件始终是允许的。你基本上是在告诉编译器它确实是这个类型。在运行时,JVM仍会在ClassCastException上捕获错误。

但是,编译器错误是因为SomeClass类中没有callSuperApple方法。演员阵容是允许的,但是这个消息是在你演奏的课程中不存在的方法fruit - SomeClass

加成

如今,随着问题的变化,有一个callSuperApple方法SomeClass。现在,编译器错误是error: inconvertible types,因为编译器知道两个类都不能转换为另一个类,因为两个类都不是另一个的超类,直接或间接。 A SomeClass不是Fruit,并且Fruit不是SomeClass

你会得到同样的错误有:

Number n2 = (Number) "blah"; 

,因为无论NumberString不是彼此的父。

+0

该方法已在SomeClass和Fruit中实现(尽可能),但仍有错误。请参阅编辑。谢谢 –

+0

不能从水果投到SomeClass –

+0

@NihalSharma我已经添加到我的答案。 – rgettman

相关问题