Frage

Ich versuche, Java Verhalten zu verstehen. Mit Hilfe dieser Schnittstellen:

public interface IA {}
public interface IB extends IA {}
public class myClass implements IB {}

Ich bin eine Methode, wie diese Überlastung:

public void method(IA a);
public void method(IB b);

Wenn Verfahren mit dem folgenden Objekt aufrufen:

IA a = new myClass();
method(a);

Warum Java-Anwendung:

 public void method(IA a);

statt

public void method(IB b);

Danke

War es hilfreich?

Lösung

Da die Compiler nur, dass a kennen, ist eine Instanz von IA. Überlastungen sind zum Zeitpunkt der Kompilierung bestimmt auf der Grundlage der Kompilierung-Typen der Ausdrücke beteiligt, und der Kompilierung-Typ a ist IA.

(Man vergleiche dies mit zwingender, wobei das Verfahren der Umsetzung auf gewählt wird Ausführung Zeit basierend auf dem tatsächlichen Typ beteiligt.)

Andere Tipps

Die Zeile

 IA a = new myClass();

definiert das Objekt ein als Typ IA und das ist alles, der Compiler kennt. Es kann nicht davon ausgehen, dass ein auch IB ist, weil es durchaus möglich ist, für diese wahr zu sein:

 public class MyClass2 implements IA{}

 IA a = new MyClass2();
 method(a);

in diesem Fall eine ist KEIN IB wie in Ihrem Beispiel. So macht der Compiler keine Annahmen über die Art andere als das, was Sie zur Verfügung stellen. So hat es die Methode aufzurufen, die IA akzeptiert.

Da Sie vorbei "a", das ist ein Argument IA.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top