簡體   English   中英

將超類obj轉換為子類obj時出現Java錯誤

[英]Java error on casting a superclass obj to a subclass obj

我有一個愚蠢的Java問題,這是一個場景

Class A {}
Class AA extends A{}

AA aa = new AA()
A a = new A()

當我做

aa = (AA) a; 

我在線程“ main” java.lang.ClassCastException中遇到諸如Exception之類的錯誤:無法轉換為AA

問題出在哪兒?

這是您的繼承層次結構

Object
  |
  A       <--------- your object
  |
  AA

變量a引用類型A的對象,但是您試圖將其強制轉換為AA 這是不可能的,因為A不是AA

AAA ,所以您可以做到

A a = new AA();
AA a = (AA) a;

但是您卻做了相反的事情。

您可以將子類實例轉換為超類,但不能將超類實例轉換為子類。

引用對象的變量可以與該對象具有相同的類型,也可以是該對象的任何超類型

SubType sub = new SuperType();

...將無法編譯,因為“ new SuperType()”返回類型SuperType的引用,並且編譯器知道SuperType不是子類型。

class Animal { }
class Dog extends Animal { }
class DogTest {
  public static void main(String [] args) {
    Animal animal = new Animal();
    Dog d = (Dog) animal; // compiles but fails later
  }
}

太瘋狂了! 此代碼編譯! 當我們嘗試運行它時,我們將收到類似以下的異常: java.lang.ClassCastException

為什么我們不能信任編譯器來幫助我們呢? 它看不到動物是動物類型的嗎?

編譯器所能做的就是驗證這兩種類型是否在同一個繼承樹中,以便根據垂降之前可能出現的任何代碼,動物可能是Dog類型的。 編譯器必須允許在運行時可能起作用的內容。

但是,如果編譯器確定地知道強制轉換可能無法進行,則編譯將失敗。

以下替換代碼塊將無法編譯

Animal animal = new Animal();
Dog d = (Dog) animal;
String s = (String) animal; // animal can't EVER be a String

在這種情況下,您會得到如下錯誤: 不可轉換類型

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM