簡體   English   中英

將基礎類對象轉換為擴展基礎類的類時的ClassCastException

[英]ClassCastException when casting a base class object to an class that extends base class

我已經在代碼行中提到了我想理解的注釋 ,如下所示:

  1. 我不明白這行代碼:Xyz obj3 Xyz obj3=(Xyz) obj1;

  2. Abc不能XyzXyz類型。 已編譯,但在執行過程中返回異常: Xyz obj2=(Xyz)new Abc();

     class Abc { Abc() { System.out.println(" Hello "); } void show() { System.out.println("Conco constructor w/ Super Class"); } } class Xyz extends Abc { Xyz() { System.out.println(" Hi "); } void display() { System.out.println("ConsNew3 constructor w/ Extends Class Conco"); } public static void main(String arg[]) { Xyz obj=new Xyz(); Abc obj1=new Xyz(); obj1.show(); Xyz obj3=(Xyz) obj1; // I didnt't understand this line of code /*Xyz obj2=(Xyz)new Abc(); Abc cannot be cast to Xyz type . Compiled , but returns exception during execution */ } } 

一般而言,盡管程序要求,人類的抽象符號表示不是很好。

編程的初學者(更正確地說是任何人)都不應使用Abc和Xyz等抽象名稱,這甚至會使高級程序員感到困惑。

為什么不將Abc重命名為Animal,將Xyz重命名為Dog。

然后您有:

Dog obj3=(Dog) obj1; // works because Dog is an Animal.
Dog obj2=(Dog) new Animal(); // does not compile because not all Animals are Dogs

Xyz obj3=(Xyz) obj1; 這行有效,因為XyzAbc

Xyz obj2=(Xyz)new Abc(); 這行不起作用,因為並非所有Abc都是Xyz

正如評論所提到的,用這種方式命名事物可能更有意義。

Abc ==動物

Xyz ==狗

Dog obj3 = (Dog) obj1;

obj1以前被實例化為Dog盡管它由更通用的Animal對象持有。 它仍然是Dog一個實例,因此可以將其轉換回Dog

Dog obj2 = (Dog) new Animal();

Animal不一定是Dog

為了避免出現此類問題,您可以使用instanceof運算符。 這將測試通用對象是否是另一個(通常是更特定的)對象的實例。

您可以如下使用。

Object myGenericDog = new Dog();
Animal myAnimal = new Animal();

if(myGenericDog instanceof Animal){
    myAnimal = (Animal) myGenericDog;
}

供將來參考,在真實代碼和示例代碼的情況下,這對開發人員編寫代碼以及將來可能最終維護代碼以使用描述性類名的任何將來的開發人員都有利。 注意: XyzAbc不是描述性的 它們引入了不必要的復雜性。 您可以通過選擇名詞和描述類責任的名稱來改進自己的代碼和示例。

暫無
暫無

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

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