@ talex прав, и оригинальный вопрос определенно стоит ответить, несмотря на провокационный замысел.
Тип стирания для универсальных методов
объясняет, что параметр неограниченного типа компилируется в Object
.
Итак, объявление этого интерфейса
interface Q {
public <K, V> Map<K, V> fetch(K id);
}
у вас есть следующий интерфейс для расширения во время выполнения
interface Q {
public Map<Object, Object> fetch(Object id);
}
Компилятор обращает особое внимание на аргументы метода, поскольку они участвуют в правильной сигнатуре для вызова обнаружения, он не позволяет вам сделать объявленный тип аргумента более конкретным и остаться в той же сигнатуре на в то же время.
Тип возвращаемого значения не сильно беспокоит компилятор.
Таким образом, следующая реализация может быть обнаружена как та же сигнатура
abstract class QA implements Q {
public abstract Map<Integer, String> fetch(Object id);
}
но не может иметь этого в этой роли:
abstract class QA implements Q {
public abstract Map<Integer, String> fetch(Integer id);
}
Если вы действительно хотите какую-то конкретную особенность для аргумента метода, bound ваш параметр типа каким-либо образом - таким образом, он может быть скомпилирован с более широкой информацией.
interface O {
<K extends List, V> V process(K id);
}
abstract class OA implements O {
public abstract String process(List id);
}