2015-11-04 40 views
0

为什么我们可以从一个超类垂下来,像这样子类:在Java中向下转换类与向下转换接口的区别?

Object o = getStringObject(); 
String str = (String) o; 

但然后用同样的原理DOWN投的接口,一个子类如α-

InterfaceType anInterface; 
anInterface = (InterfaceType) SubClassVar; 

所以实施例1都很好,很花哨。我不明白的是,如果一个接口是一个实现它的类的超类型,那么当我们向该接口下传类时,如果接口的层次更高,我们怎么会没有ClassCastException?我在某处读到,通过类和界面进行投射是有区别的,但当然他们不想解释为什么,所以我仍然公开。谢谢,Stack!

+2

我很困惑。你是说'SubClassVar'是一个'InterfaceType'?那么演员阵容没有用处。 –

+0

@SotiriosDelimanolis SubClassVar是一个类实现InterfaceType – 3alto

+0

@SotiriosDelimanolis也许我需要更多的信息,但如果你为android开发,这是沟通模式,用于交谈活动和片段之间。 – 3alto

回答

2

从技术上说,您已经上传到接口,因为它在层次结构中比该接口的(推测的)实现者更高,SubClassVar。此外,这种转换甚至是不需要的,因为无论如何都可以通过该接口来讨论接口的实现,而无需强制转换语法。

您可以可以向下倾斜一个接口,就像您对子类所做的那样。这里有一个例子:当程序员显式转换一个类型到另

interface I1 {} 
interface I2 extends I1 {} 

class I2Impl implements I2 {} 

class Main { 
    public static void main(String[] args) { 
     I1 test = new I2Impl(); 
     I2 test2 = (I2)test; 
     I2Impl test3 = (I2Impl) test2; 
    } 
} 
0

,它通常是因为程序员知道更多有关运行时类型比编译器的对象。编译器可以选择允许任何投射,因为聪明的程序员这样说。然而,作为Java,编译器会试图捕捉并防止明显的错误。

不允许在两种类型之间进行强制转换,如果很明显没有对象可以同时属于这两种类型;换句话说,这两种类型的交集是空的。例如,我们不能在StringInteger之间投射;也不是StringRunnable。但是,NumberRunnable可以互相投射,因为可以想象这两种类型都可能有对象。

另外,只有A和B可以相互转换时,才能使用同一比较a==b。如果编译器知道它们不能是同一个对象,则不允许==。请参见JLS

确切的算法非常复杂 - http://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.5.1请注意,该算法是对称的 - 当且仅当B可以投射到A时,A才能投射到B.规范的文本不是很好,可能包含错误(见question

“downcast”是目标类型是子类型时; “上传”是目标类型是超类型的时候。上传通常是不必要的,但在需要时有cases