Werfen Sie einen Blick auf Abschnitt 15.12 unter der Java documention mit dem Titel "Method Invocation Expressions". Insbesondere Abschnitt 15.12.2.5 Wahl der am besten spezifische Methode:
Wenn mehr als ein Mitglied Verfahren zugänglich und anwendbar auf einen Verfahren Aufruf ist, ist es notwendig, ein wählen den Deskriptor für die Laufzeit zur Verfügung zu stellen Methodenversand. Die Java-Programmiersprache verwendet die Regel, dass die am meisten spezifische Methode gewählt wird. Die informelle Intuition ist, dass eine Methode spezifischer ist als eine andere, wenn jeder Aufruf, der von der ersten Methode behandelt wurde, an die andere ohne einen Kompilierzeitfehler übergeben werden konnte. In Fällen wie einem explizit typisierten Lambda-Ausdruck Argument (§15.27.1) oder eine Variable Arity Aufruf (§15.12.2.4), ist es etwas Flexibilität erlaubt, eine Unterschrift auf die andere zu ändern.
Außerdem Abschnitt 8.4.9 genannt Overloadding heißt es:
Wenn eine Methode aufgerufen wird (§15.12), die Anzahl der tatsächlichen Argumente (und alle Argumente des expliziten Typs) und die Kompilierzeittypen der Argumente werden zur Kompilierzeit verwendet, um die Signatur der Methode zu bestimmen, die aufgerufen wird (§15.12.2). Wenn es sich bei der Methode, die aufgerufen werden soll, um eine Instanzmethode handelt, wird die tatsächlich zu aktivierende Methode zur Laufzeit mithilfe des dynamischen Methoden-Lookups (§15.12.4) ermittelt.
diese beiden Abschnitte Berücksichtigung, können wir feststellen, dass seit method
ein List<T>
Objekt übergeben wird, das spezifische Ziel Java feststellt, dass eine Wildcard ist Collections
.
Beachten Sie, dass, auch wenn Sie das Argument zu ArrayList<T>
als solche verändert hatte:
public void method(ArrayList<T> t) {
overloadedMethod(t) ; // which method is called?
}
Das gleiche Verfahren wird noch genannt werden, weil die spezifische Überlastung, die Arraylist akzeptiert zu spezifisch ist - ArrayList<Integer>
vs. Ihr Argument, ist ArrayList<T>
und somit bestimmt Java Collection<?>
als die beste Übereinstimmung (Sie können natürlich umgehen, indem Sie entweder den Parametertyp von method
ändern oder den Parameter overloadedMethod
spezifischer machen).