Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中下推类和下推接口之间的区别?_Java_Android_Interface_Casting - Fatal编程技术网

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,编译器将尝试捕获并防止明显的错误

如果明显没有对象可以同时属于这两种类型,则不允许在这两种类型之间进行强制转换;或者换句话说,这两种类型的交集是空的。例如,我们不能在
字符串
整数
之间转换;nor
String
Runnable
。但是,
Number
Runnable
可以相互转换,因为可以想象,这两种类型中都可能有一个对象

此外,只有在a和b可以相互转换的情况下,出于相同的理由,才允许进行身份比较
a==b
<如果编译器知道它们不能是同一对象,则不允许使用代码>=。看

精确的算法非常复杂-注意算法是对称的-A可以转换为B,当且仅当B可以转换为A时。规范的文本不是很好,可能包含bug(参见此)


当目标类型是子类型时,“向下播放”;“向上转换”是指目标类型为超类型时。向上投射通常是不必要的,但在需要的时候也有。

我很困惑。你是说
子类var
是一个
接口类型
?那么强制转换就没有用了。@SotiriosDelimanolis SubClassVar是一个实现InterfaceType@SotiriosDelimanolis也许我需要更多的信息,但如果你为android开发,这就是communicator模式,用于在活动和片段之间进行对话。你的第二个片段中不需要强制转换。