2013-05-04 5 views
8

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?)

+5

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' –

+0

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

+0

Ich habe den Code in Eclipse erfüllt Indigo, Java 1.6.0_30 – sanbhat

Antwort