Ho un'interfaccia A con un metodo getT()
, abstract B class
con metodo getS()
e class C
quello si estende B class
quale implements A interface
. Sto scavalcando i metodi da A
interfaccia e B
superclasse all'interno del C
sottoclasse. Quindi nel main
metodo I istanziare il C
classe di essere typeo se A
come questo: A obj = new C();
"Sono in grado di chiamare il getT()
a partire dal obj
ma non si può chiamare getS()
metodo. Come posso chiamare getS()
metodo da obj
, ma non posso cambiare il tipo di obj
, deve essere A
. Ecco il codice:
Interfaccia A:
public interface A {
public String getT();
}
Classe astratta B:
public abstract class B implements A {
public abstract String getS();
}
sottoclasse C:
public class C extends B {
@Override
public String getT() {
System.out.println("method getT() from C class");
return null;
}
@Override
public String getS() {
return null;
}
}
E il metodo principale all'interno della classe T:
public class T {
public static void main(String[] args) {
A obj = new C();
obj.getT();
}
}
risposte:
1 per risposta № 1Con una variabile di riferimento di tipo A
, non puoi chiamare getS()
, perché potrebbe essere qualsiasi tipo che implementa A
per esempio AImplementer
, che non si estende da B
. Qualunque A
l'oggetto non ha necessariamente a getS()
metodo. E 'garantito solo per avere un getT()
metodo.
Se obj
deve essere un tipo A
e devi chiamare getS()
, quindi includi il getS()
metodo nella definizione del A
interfaccia:
public interface A {
public String getT();
public String getS(); // Add this line.
}
Poi B
è ancora un A
e puoi chiamare getS()
su un A
variabile di riferimento.
A proposito, non ne vedo static
metodi nel tuo codice. I metodi statici non possono essere sovrascritti.
1 per risposta № 2
Per accedere al metodo è necessario downcast obj a B.
Quindi potresti avere:
((B)obj).getS();
downcasting: http://www.programmerinterview.com/index.php/java-questions/downcasting-in-java/
0 per risposta № 3
la classe di tipo di obj è A, ma A non ha metodo getS () in modo da non poter chiamare il metodo principale. obj deve essere di classe B o di classe C.