2014-12-07 11 views
5

Próbuję zagłębić się głęboko w Java Generics i natknąłem się na problem opisany przez poniższy przykładowy kod.Java Generics - wywoływanie określonych metod z typów generycznych

public static void test(Object o) { 
    System.out.println("Hello Object!"); 
} 

public static void test(Integer i) { 
    System.out.println("Hello Integer!"); 
} 

public static <T> void test(Collection<T> col) { 
    for (T item : col) { 
     System.out.println(item.getClass().getSimpleName()); 
     test(item); 
    } 
} 

public static void main (String[] args) throws java.lang.Exception 
{ 
    Collection<Integer> ints = new ArrayList<>(); 
    ints.add(1); 
    test(ints); 
} 

Wyjście próbki jest

Integer 
Hello Object! 

Wszystkie typy są oczywiście znane w czasie kompilacji. O ile rozumiem, Java posiada tylko jedną skompilowaną kopię każdej metody (w przeciwieństwie do C++) i ponieważ nie ma żadnych innych ograniczeń dotyczących parametru T, jest zmuszona do wywoływania ogólnej implementacji obiektu.

Moje pytanie brzmi - czy istnieje sposób na wywołanie metody "Hello Integer" dla liczb całkowitych bez przeciążenia metody testowej dla Collection<Integer> i bez sprawdzania typu środowiska wykonawczego?

+0

Czytaj na temat "usuwania typu". – bmargulies

+0

Dzięki, jestem zaznajomiony z tą koncepcją i myślałem, że to nie jest możliwe z powodu, który podałem w PO. Ale zbyt łatwo jest po prostu powiedzieć "to niemożliwe" - gdyby tak było, mógłbym nauczyć się czegoś nowego. – Danstahr

Odpowiedz

3

Nie można tego zrobić. Z powodu typu wymazania typ Collection<T> zostanie rozwiązany, aby wpisać Collection<Object>. Erasure of Generic Methods

1

Nie, nie możesz zrobić tego, o co prosisz, z powodów, które podałeś. Usunięcie typu oznacza, że ​​przeciążenie jest rozwiązywane jednokrotnie dla wszystkich zmiennych typu i musi zostać rozwiązane do obiektu.

Powiązane problemy