1

型がインターフェイスである参照変数に割り当てられるオブジェクトは、インターフェイスを実装するクラスのインスタンスである可能性があることを知っています。ただし、次のコード ブロックの場合:

public interface foo {
    public abstract void method_1();
}

class bar implements foo {  
    @Overide
    public void method_1() { //Implementation... }

    public void method_2() { //Do some thing... } 
}
.....

foo variable = new bar();
variable.method_1(); // OK;
variable.method_2(); // Is it legal?

変数(宣言された型は foo ですが、実際の型は bar です) に、インターフェイスで宣言されていないメソッド_2 を呼び出させることはできますか? 前もって感謝します!

4

5 に答える 5

2

variable.method_2()variableタイプのようにコンパイルされませんfoofooメソッドがありませんmethod_2()

于 2013-02-04T17:05:56.990 に答える
2

はい、キャストできます:

((bar)variable).method_2();

しかし、おそらくそうすべきではありません。インターフェイスの要点は、提供されているメソッドのみを使用することです。それらが十分でない場合は、インターフェースを使用しないでください。

于 2013-02-04T17:06:11.797 に答える
2

いいえそうではありません。にアクセスする場合method_2は、のタイプをに宣言する必要がありvariableますbar

于 2013-02-04T17:06:13.030 に答える
1

いいえ、それは合法ではありません。ただし、実行時にタイプを検査して、正しいタイプにキャストすることができます。

if (variable instanceof bar) ((bar)variable).method_2();

(厳密に言えばinstanceof、タイプが正しいことが確実にわかっている場合はチェックなしでキャストできます。間違っている場合は例外がスローされます。)

于 2013-02-04T17:08:00.060 に答える
1

Is it possible to make the variable (whose declared type is foo but actual type is bar) call the method_2 which is not declared in the interface ?

不可能ではありません。コンパイル時エラーになります。

あなたのコードにも他の標準偏差があります

  1. インターフェースとクラス名は大文字のキャメルケースにする必要があります (これは UpperCamelCase です)。
于 2013-02-04T17:07:26.580 に答える