2013-10-02 5 views
8

は明らかに、これはコンパイルエラーが発生:のJava:議長は、猫に関連していないので、関係のないインターフェイスにクラスをキャスト

class Chair {} 
class Cat {} 

class Test { 
    public static void main(String[] args) { 
     Chair chair = new Char(); Cat cat = new Cat(); 
     chair = (Chair)cat; //compile error 
    } 
} 

なぜそれは私がする場合にのみ、実行時に例外を取得していること、そしてありますコンパイラはCatがFurnitureを実装していないことを明らかに示していますが、私は無関係なインターフェイスFurnitureへのCatリファレンスをキャストしていますか?

interface Furniture {} 

class Test { 
    public static void main(String[] args) { 
     Furniture f; Cat cat = new Cat(); 
     f = (Furniture)cat; //runtime error 
    } 
} 
+0

実行時に多型が発生するためです。 –

+0

コンパイラはCatがFurnitureを実装しておらず、実行時に変更できないことを知っていますか?私は単純な点を見逃しているかもしれませんが、あなたの答えは本当に私を助けません – enp4yne

+0

。 Catは家具を直接実装することはできませんが、Catのスーパークラスのいくつかは可能性があります。そしてコンパイラは、インタフェースのルールがかなり畳み込まれているので、このような醜い詳細を掘り下げないことを選択します。 (ありがとう、Sun)そして、コンパイラが不可避な実行時例外(ゼロで割るなど)を検出することを要求する一般的なルールはありません。 –

答えて

12

これは

interface Furniture {} 

class Test { 
    public static void main(String[] args) { 
     Furniture f; Cat cat = new Cat(); 
     f = (Furniture)cat; //runtime error 
    } 
} 

をコンパイルする理由は、あなたは非常によくあなたがCatFurnitureインスタンスを作成する場合は、Cat catに割り当てることができますし、そのインスタンスをすることができ

public class CatFurniture extends Cat implements Furniture {} 

を持っているかもしれないということですFurnitureに鋳造された。つまり、一部のCatサブタイプがFurnitureインターフェイスを実装している可能性があります。

あなたの最初の例では

class Test { 
    public static void main(String[] args) { 
     Chair chair = new Char(); Cat cat = new Cat(); 
     chair = (Chair)cat; //compile error 
    } 
} 

それ自体はChairから延びChairCatない限り、いくつかのCatサブタイプが拡張することは不可能です。

+4

'Cat'が' final'と宣言された場合、コンパイラは実際に不平を言うことに注意してください( 'Cat'のサブクラスは' Furniture'を実装することができません'Cat'のサブクラスは存在しません)。 –

関連する問題