4

まあ言ってみれば:

class A {
    public int fieldA = 0;
}

class B extends A {
    public int fieldB = 0; 
}

ここで、A から B のインスタンスを作成します。

A a = new A();
B b = (B) new A();

これにより、classCastException が発生します。B で A インスタンスを取り、フィールドをコピーするコストラクタを作成できますが、明らかに実用的ではありません。

class B extends A {
    public int fieldB = 0; 

    B (A a){
        fieldA = a.fieldA;
    }
}

ご協力ありがとうございました

4

6 に答える 6

8

次の例を見てください

public class Animal
{
  public void eat(){}
}
public class Dog extends Animal
{
  public void eat(){}
  public void main(String[] args)
  {
    Animal animal=new Animal();
    Dog dog=(Dog) animal; //will not work
  }
}

キャストを使用することで、本質的にコンパイラーに「私を信じてください。私はプロであり、自分が何をしているのかを知っています。保証はできませんが、この動物変数は間違いなく犬になります。」

動物は実際には犬ではないため (動物なので、 Animal animal = new Dog(); を実行すると犬になります)、VM は実行時に例外をスローします。これは、その信頼に違反したためです (コンパイラはすべて問題ありませんが、そうではありません!)

コンパイラは、盲目的にすべてを受け入れるよりも少し賢く、異なる継承階層でオブジェクトをキャストしようとすると (たとえば、Dog を文字列にキャストする)、コンパイラはそれをスローします。

基本的には、コンパイラが不平を言うのを止めているだけなので、キャストするたびに、if ステートメントで instanceof を使用して ClassCastException を発生させないことを確認することが重要です (またはそのような効果があります)。

あなたの場合、私の参照 b がポイント B のオブジェクトを指していると言っているので、クラス A のオブジェクトを指すようにします (これは、参照 b が期待していたクラス B のオブジェクトではありません)。したがって、classCastException が発生します。

次のようなことができます

A a = new B();
B b = (B) a;
于 2013-05-30T09:53:16.980 に答える
1

Animalと を得たとしましょうDog extends Animal「犬は動物です」とは言えますが( )、 「動物は犬です」とはAnimal animal = new Dog()言えません( )。Dog dog = new Animal()

AnAnimalは aCatまたは何でもあり得ますが、 aDogまたは aCatは必ず anAnimalです。

于 2013-05-30T09:53:54.017 に答える
1

Class キャストの使用は別のものです。

class Employee()
{
    //body
}

class SalariedEmployee extends Employee()
{
    //body
}

ポリモーフィック コードがあります。

public static void met(Employee e)
{
    SalariedEmployee s = (SalariedEmployee)e
}

public static void somemethod()
{
    //You write a polymorphic method
    //You will create a list of Employees
    //Then you can write
    ArrayList<Employee> employees = new ArrayList<Employee>()

   //Create a SalariedEmployee
   Employee e = (Employee) new SalariedEmployee()
   employees.add(e);

   e = (Employee) new CommissionEmployee()
   employees.add(e);         

}

SalariedEmployee b = (SalariedEmployee) new Employee();everyEmployeeが であることが保証されていないため、できませんSalariedEmployee

于 2013-05-30T09:42:37.157 に答える