Java 为什么“ClassCastException”出现在我的代码中?

Java 为什么“ClassCastException”出现在我的代码中?,java,Java,为什么这里会发生ClassCastException?您收到的ClassCastException符合: 下面是检查对象的运行时类型R是否与类型T(即在强制转换运算符中指定的类型的擦除)的赋值兼容的算法。如果引发运行时异常,则它是ClassCastException 如果R是普通类而不是数组类: 如果T是类类型,则R必须与T是同一类或T的子类,否则会引发运行时异常 在你的例子中,R是Beta,T是Delta。请注意,Beta不是Delta的子类。您收到的ClassCastException符

为什么这里会发生ClassCastException?

您收到的ClassCastException符合:

下面是检查对象的运行时类型R是否与类型T(即在强制转换运算符中指定的类型的擦除)的赋值兼容的算法。如果引发运行时异常,则它是ClassCastException

如果R是普通类而不是数组类:

如果T是类类型,则R必须与T是同一类或T的子类,否则会引发运行时异常

在你的例子中,R是Beta,T是Delta。请注意,Beta不是Delta的子类。

您收到的ClassCastException符合:

下面是检查对象的运行时类型R是否与类型T(即在强制转换运算符中指定的类型的擦除)的赋值兼容的算法。如果引发运行时异常,则它是ClassCastException

如果R是普通类而不是数组类:

如果T是类类型,则R必须与T是同一类或T的子类,否则会引发运行时异常

在你的例子中,R是Beta,T是Delta。请注意,Beta不是Delta的子类。

您将x转换为Delta,但x是Beta类型,它由Delta扩展,反之亦然。因此,您的ClassCastException

顺便问一下,Gamma发生了什么事?

您将x转换为Delta,但x是Beta类型,它由Delta扩展,而不是相反。因此,您的ClassCastException


顺便问一下,Gamma怎么了?

刚刚用简单的英语编写了代码:

阿尔法是福

贝塔是阿尔法

德尔塔是贝塔

注: 贝塔不是三角洲

在这里换行

interface Foo {}
class Alpha implements Foo {}
class Beta extends Alpha {}

class Delta extends Beta {
    public static void main( String[] args ) {
        Beta x = new Beta();
        Foo f=(Delta) x; 
    }
}

希望这有帮助。如果您有任何问题,请告诉我。

刚刚用简单的英语编写了代码:

阿尔法是福

贝塔是阿尔法

德尔塔是贝塔

注: 贝塔不是三角洲

在这里换行

interface Foo {}
class Alpha implements Foo {}
class Beta extends Alpha {}

class Delta extends Beta {
    public static void main( String[] args ) {
        Beta x = new Beta();
        Foo f=(Delta) x; 
    }
}

希望这有帮助。如果您有任何问题,请告诉我。

因为不是每只动物都是狗,所以这只是反过来说的。三角形是β,但β不一定是δ。请参阅此处,因为不是每只动物都是狗,所以这只是反过来说的。δ是β,但β不一定是δ。请参阅此处