Während ich einige Läufe tat etwas Code in diesem thread ich eine seltsame Sache gefunden zu testen, wenn Sie das folgende Programm betrachtenJava -Methodenüberladung - Mehrdeutigkeit
import java.util.ArrayList;
import java.util.List;
public class OverloadTest {
public String test1(List l){
return "abc";
}
public int test1(List<Integer> l){
return 1;
}
public static void main(String [] args) {
List l = new ArrayList();
System.out.println(new OverloadTest().test1(l));
}
}
Ich erwartete Java-Compiler Mehrdeutigkeit zu zeigen, Fehler wegen Byte-Code Erasure-Eigenschaft, aber es tat es nicht. Nun, wenn ich versuchte, diesen Code auszuführen, erwarte ich, dass test1(List)
aufgerufen wird, und der Ausgang wäre "abc"
aber zu meiner Überraschung nannte es test1(List<Integer>)
(Ausgabe war 1
)
Ich versuchte sogar, wie unten
List l = new ArrayList();
l.add("a");
System.out.println(new OverloadTest().test1(l));
Aber noch gefunden Java test1(List<Integer> param)
Methode aufrufen und wenn ich die param
inspiziert hatte die String
„a“ (wie Java List<String>
-List<Integer>
geworfen hat?)
Der Code, den Sie zur Verfügung gestellt haben gar nicht für mich zusammenstellen - ich erhalte eine Fehlermeldung aus: 'Fehler: Name Zusammenstoß: test1 (List) und test1 (List) haben die gleiche erasure' –
Hier gilt das gleiche, in Java Templated Datenstrukturen sind miteinander verbunden, so sollte es nicht kompilieren, aber wenn Sie C++ etwas ähnliches wie kompilieren als Template-Klassen verwenden verwenden keine gemeinsame – aaronman
Ich habe den Code in Eclipse erfüllt Indigo, Java 1.6.0_30 – sanbhat