У меня есть интерфейс:
public static interface Consumer<T> {
void consume(T t);
}
И я хочу иметь:
public static class Foo implements Consumer<String>, Consumer<Integer> {
public void consume(String t) {..}
public void consume(Integer i) {..}
}
Это не работает - компилятор не позволяет вам реализовать один и тот же интерфейс дважды.
Вопрос: Почему?
Люди задавали подобные вопросы здесь, но ответ был всегда "стиранием типа", т.е. вы не можете этого сделать, потому что типы стираются во время выполнения.
И это не так - некоторые типы сохраняются во время выполнения. И они сохраняются в этом конкретном случае:
public static void main(String[] args) throws Exception {
ParameterizedType type = (ParameterizedType) Foo.class.getGenericInterfaces()[0];
System.out.println(type.getActualTypeArguments()[0]);
}
Это печатает class java.lang.String
(если я компилирую только Consumer<String>
)
Таким образом, стирание в его простейшем объяснении не является причиной или, по крайней мере, нуждается в разработке - там есть тип, а также, вы не заботитесь о разрешении типа, потому что у вас уже есть два метода с четкими подпись. Или, по крайней мере, так кажется.