Domanda

Ho un API esterna (non posso modificarla) con classe "A" e classe locale "B" che sostituisce metodi di "A" e aggiunge una funzione aggiuntiva. Ho bisogno di usare uno di loro, secondo alcuni parametri "is_a".

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

package A;

public class A {

    public int pingA( int value ) {

        return value;

    }

}

/ ------ mia classe (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);
        }
    }
}

In questo caso voglio usare classe "B", ma il comando "int n = (3) obj.pingB;" non è compilato perché non esiste un metodo pingB in A. Il messaggio esatto è:

cannot find symbol
symbol: method pingB(int)
location: class A.A
È stato utile?

Soluzione

È necessario gettato obj di nuovo a B.

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

È possibile dal modo in cui meglio usare il instanceof parola chiave invece di is_A.

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

Altri suggerimenti

Stai salvando un nuovo metodo in una sottoclasse che non esiste nella classe eccellente. Non c'è modo di chiamare il nuovo metodo nella sottoclasse con un riferimento alla superclasse. Dovreste cast al tipo sottoclasse di utilizzare il nuovo metodo.

Si potrebbe fare qualcosa di simile:

A obj = new B();

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

Ecco B è un A ma A non è un B quindi non ha il metodo pingB (int).

È necessario lanciare alla classe derivata per essere in grado di chiamare è metodi. Di solito questo è fatto con e if( obj instanceof B ) ma come si dispone già di un valore booleano con queste informazioni sta andando a guardare come questo:

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); 
    } 
}

obj è ancora avere il tipo A (-> si dichiarato un obj;) -> in questo modo il tipo di rilegatura non funziona per la compilazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top