1

クラス「A」とローカルクラス「B」の外部API(変更できません)があり、「A」のメソッドをオーバーライドして関数を追加しています。パラメータ「is_A」に従って、そのうちの1つを使用する必要があります。

/ ------ API(A.java)----- /

package A;

public class A {

    public int pingA( int value ) {

        return value;

    }

}

/ ------私のクラス(B.java)----- /

package B;

import A.*;

public class B extends A {

    @Override
    public int pingA( int value ) {
        return value;
    }

    public int pingB( int value ) {
        return value;
    }

    public static void main(String[] args) {
        final boolean is_A = false;
        A obj;
        if (is_A) {
            obj = new A();
        } else {
            obj = new B();
        }
        if (!is_A) {
            int n = obj.pingB(3);
        }
    }
}

この場合、クラス「B」を使用したいのですが、コマンド「int n = obj.pingB(3);」AにはメソッドpingBがないため、コンパイルされません。正確なメッセージは次のとおりです。

cannot find symbol
symbol: method pingB(int)
location: class A.A
4

4 に答える 4

7

スーパークラスに存在しないサブクラスに新しいメソッドを追加しています。スーパークラスへの参照を使用して、サブクラスの新しいメソッドを呼び出す方法はありません。新しいメソッドを使用するには、サブクラスタイプにキャストする必要があります。

あなたは次のようなことをすることができます:

A obj = new B();

if (obj instance of B) {
   B b = (B)obj;
   int n = b.pingB(3);
}

BこれはですAABそうではないので、pingB(int)メソッドはありません。

于 2010-01-08T00:26:38.443 に答える
2

にキャスト objバックする必要がありますB

if (!is_A) {
    int n = ((B) obj).pingB(3);
}

instanceofちなみに、の代わりにキーワードを使用する方がよいでしょうis_A

if (obj instanceof B) {
    int n = ((B) obj).pingB(3);
}
于 2010-01-08T00:29:17.050 に答える
1

メソッドを呼び出せるようにするには、派生クラスにキャストする必要があります。通常、これはで行われif( obj instanceof B )ますが、その情報を含むブール値がすでにあるため、次のようになります。

public static void main(String[] args) { 
    final boolean is_A = false; 
    A obj; 
    if (is_A) { 
        obj = new A(); 
    } else { 
        obj = new B(); 
    } 
    if (!is_A) { 
        int n = ((B) obj).pingB(3); 
    } 
}
于 2010-01-08T00:33:05.740 に答える
0

objはまだタイプAを持っています(->あなたがA objを宣言しました;)->このように、タイプバインディングはコンパイルに対して機能しません。

于 2010-01-08T00:29:23.163 に答える