Имея следующий пример:Как я могу назвать наиболее специфический метод с помощью дженериков?
public class Test {
public static class A {}
public static void main(String[] args) {
A a = new A();
m1(a);
}
public static <T> void m1(T t) {
// t.getClass().getSimpleName() is A
// t instanceof A is true
m2(t);
}
/* Not called */
public static void m2(A a) {
System.out.println("A");
}
public static void m2(Object o) {
// o.getClass().getSimpleName() is A
// o instanceof A is true
System.out.println("O");
}
}
Я не понимаю, почему m2(Object o)
выбран вместо m2(A a)
. Как вы можете видеть, когда вызывается m2(t)
, t
«является A
».
Выход:
фактической
O
ожидается
A
Как я могу использовать генерики ситуации выше, так т шляпа m2(A a)
выбрано?
Edit:
Я хотел бы иметь общее решение, которое будет работать, даже если добавить тип B
(по аналогии с A
).
...
public static void main(String[] args) {
A a = new A();
m1(a);
B b = new B();
m1(b);
}
...
public static void m2(B b) {
System.out.println("B");
}
...
Выход:
фактической
O O
ожидается
A B
Слово, которое вы ищете, [ «стиранием»] (https://docs.oracle.com /javase/tutorial/java/generics/erasure.html). – Tom
Java generics не являются шаблонами. То, что вы просите в редактировании, невозможно. – Radiodef