2017-02-06 11 views
-5

は、私たちが人クラスなぜインターフェイスでキャストされたオブジェクトをキャストする必要がありますか? Javaで

class Person{ 
    public void eats(Edible fruit){ 
     fruit.getDueDate(); 
    } 
} 

食用

public interface Edible { 
    public boolean isEdible(); 
} 

class Fruit Implements Edible{ 
    public String getDueDate(){ 
     return this.dueDate; 
    } 
    public boolean isEdible(){ 
     return True; 
    } 
} 

を実装するクラスフルーツを持っていると私は

Edible apple = new Fruit(); 
Person p1 = new Person() 
p1.eats(apple) 

が、以下のかと言うことができます私は必要なのでそれは動作しませんこれを再びFruitにキャストするには、コンパイラが言うように:

class Person{ 
    public void eats(Edible fruit){ 
     Fruit fruit = (Fruit) fruit; 
     fruit.getDueDate(); 
    } 
} 

なぜですか?私はオブジェクトを投げずにそのメソッドにアクセスできると思った。

+0

'Edible'は実際に' isEdible'メソッドを宣言していますか? – user2357112

+0

変数について知っている唯一のことは、 'Edible'です。このケースでオブジェクトをキャストすべきではありません。実際には何かを保証することはできないので、' Edible'だけです。 – MadProgrammer

+0

なぜ地獄ですか? * false *を返すisEdibleメソッドを実装しているEdibleそれは食用かどうか? – user2357112

答えて

0

インターフェイスで定義されたメソッドにキャストせずにアクセスできます。ここでの問題は、変数の割り当てです。あなたのメソッドは、タイプがEdibleのオブジェクトをパラメータとして受け取りますが、ローカル変数のタイプはFruitです。 FruitのタイプはEdibleですが、コンパイラは、渡したオブジェクトが実行時までFruitであり、他のオブジェクトではないことを確認できません。 (別のタイプのEdibleをそのメソッドに渡すと、ClassCastExceptionになります)。

いくつかのコメント者が指摘したように、実際にあなたの定義はこの投稿にEdibleは含まれていません。あなたはどのEdibleisEdible()を呼び出すことができるようにしたい場合は、お使いのインタフェースの定義は次のようになります。あなたはそれをやった場合

public interface Edible { 
    boolean isEdible(); 
} 

は、あなたがEdibleパラメータにisEdible()を呼び出すことができるはずです。

public void eat(Edible food) { 
    food.isEdible(); 
} 
+0

申し訳ありませんが私の例を作って間違いました問題は、インターフェイスでメソッドを定義していない、私はそれを今再び確認してください固定しました。 – LuisDavis

+0

私はあなたがインターフェイスを書いていて、ポストにそれを含めなかったと思っていましたが、場合によっては情報をそこに入れました。 –

関連する問題