Мне было интересно, почему следующий код не может использовать информацию типа обобщенного типа для правильного поиска наиболее специфичной перегрузки метода, вместо этого он всегда использует применимый метод ко всем потенциальным общим параметрам. Нет ли способа включить общий тип параметра во время компиляции, чтобы избежать неприятного отражения во время выполнения?Java почему перегрузка метода из общего типа не может быть определена во время компиляции
import org.junit.Assert;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
public class Temp {
class A<T> {
T x;
A(T x) {
this.x = x;
}
String bar = foo(x);
private String foo(Integer i) {
return "Int";
}
private String foo(String i) {
return "String";
}
private <T> String foo(List<T> l) {
return "List";
}
private <T> String foo(T v) {
return "Value";
}
}
@Test
public void IntTest() {
Assert.assertEquals(new A<Integer>(1).bar, "Int");
}
@Test
public void StringTest() {
Assert.assertEquals(new A<String>("A").bar, "String");
}
@Test
public void ListTest() {
Assert.assertEquals(new A<List<String>>(new ArrayList<String>()).bar, "List");
}
@Test
public void LongTest() {
Assert.assertEquals(new A<Long>(1L).bar, "Value");
}
}
Возможный дубликат [Метод имеет такое же стирание, как и другой метод в типе] (http://stackoverflow.com/questions/1998544/method-has-the-same-erasure-as-another-method-in-type) –
Типы не имеют такого же стирания, хотя - Integer, String, List - все разные стирания. – Woodz