Java中下推类和下推接口之间的区别?
为什么我们可以从一个超类转换成这样的子类:Java中下推类和下推接口之间的区别?,java,android,interface,casting,Java,Android,Interface,Casting,为什么我们可以从一个超类转换成这样的子类: Object o = getStringObject(); String str = (String) o; 但是,使用相同的原则将接口向下转换为子类型,例如 InterfaceType anInterface; anInterface = (InterfaceType) SubClassVar; 因此,示例1非常好。我不明白的是,如果接口是实现它的类的超级类型,那么当我们将类向下转换到接口时,如果在层次结构中接口更高,那么我们怎么没有ClassC
Object o = getStringObject();
String str = (String) o;
但是,使用相同的原则将接口向下转换为子类型,例如
InterfaceType anInterface;
anInterface = (InterfaceType) SubClassVar;
因此,示例1非常好。我不明白的是,如果接口是实现它的类的超级类型,那么当我们将类向下转换到接口时,如果在层次结构中接口更高,那么我们怎么没有ClassCastException呢?我在某个地方读到,通过类进行转换和通过接口进行转换是有区别的,但他们当然不想解释原因,所以我没有公开。谢谢,斯塔克 从技术上讲,您向上转换接口是因为它在层次结构中比该接口的(假定的?)实现者
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;
}
}
当程序员显式地将一种类型转换为另一种类型时,这通常是因为程序员比编译器更了解对象的运行时类型。编译器可以选择允许任何强制转换,因为聪明的程序员这么说。但是,作为Java,编译器将尝试捕获并防止明显的错误 如果明显没有对象可以同时属于这两种类型,则不允许在这两种类型之间进行强制转换;或者换句话说,这两种类型的交集是空的。例如,我们不能在
字符串
和整数
之间转换;norString
和Runnable
。但是,Number
和Runnable
可以相互转换,因为可以想象,这两种类型中都可能有一个对象
此外,只有在a和b可以相互转换的情况下,出于相同的理由,才允许进行身份比较a==b
<如果编译器知道它们不能是同一对象,则不允许使用代码>=。看
精确的算法非常复杂-注意算法是对称的-A可以转换为B,当且仅当B可以转换为A时。规范的文本不是很好,可能包含bug(参见此)
当目标类型是子类型时,“向下播放”;“向上转换”是指目标类型为超类型时。向上投射通常是不必要的,但在需要的时候也有。我很困惑。你是说
子类var
是一个接口类型
?那么强制转换就没有用了。@SotiriosDelimanolis SubClassVar是一个实现InterfaceType@SotiriosDelimanolis也许我需要更多的信息,但如果你为android开发,这就是communicator模式,用于在活动和片段之间进行对话。你的第二个片段中不需要强制转换。