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?
Czytaj na temat "usuwania typu". – bmargulies
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