2013-05-04 14 views
8

Chociaż robiłem kilka tras do testowania kodu w tym thread znalazłem się dziwne rzeczy, Jeśli wziąć pod uwagę następujący programJava metoda przeciążenie - dwuznaczność

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)); 
    } 
} 

Spodziewałem kompilatora Java, aby pokazać dwuznaczność error ze względu na właściwość Errors kodu bajta, ale tak się nie stało. Teraz, gdy próbowałem uruchomić ten kod, spodziewałem się, że test1(List) zostanie wywołana, a wyjście będzie "abc" ale ku mojemu zaskoczeniu to nazywa test1(List<Integer>) (wyjście było 1)

Próbowałem nawet jak poniżej

List l = new ArrayList(); 
l.add("a"); 
System.out.println(new OverloadTest().test1(l)); 

Ale jeszcze znaleźć Java wywołanie test1(List<Integer> param) sposób i kiedy obejrzał param miał "a" String (jak zrobił Java cast List<String> do List<Integer>?)

+5

Podany przeze mnie kod nie jest dla mnie kompilowany - pojawia się błąd: 'error: nazwa clash: test1 (lista ) i test1 (lista) mają to samo usunięcie' –

+0

To samo w struktury danych na szablonach java są powiązane, więc nie powinno się ich kompilować, jednak jeśli użyjesz C++ coś podobnego do tego może się skompilować jako klasa szablonowa, nie udostępniaj niczego – aaronman

+0

Mam kod zgodny w Eclipse Indigo, Java 1.6.0_30 – sanbhat

Odpowiedz