Два add
методов в этом классе имеют одинаковую стертую подпись:Почему в Java невозможно удалить стертые типы?
class extend
{
Integer add (Integer a, Integer b)
{
return a + b;
}
<Type extends Integer> Type add (Type a, Type b)
{
return a + b;
}
}
Это делает невозможным иметь их обоих в одном классе. Компилятор сообщает следующее сообщение об ошибке:
extend.java:8: error: name clash: add(Type,Type) and add(Integer,Integer) have the same erasure Type add (Type a, Type b) ^ where Type is a type-variable: Type extends Integer declared in method add(Type,Type)
Но если они эквивалентны, почему это распаковка не сделано во втором случае. Компилятор сообщает следующее сообщение об ошибке:
extend.java:10: error: incompatible types return a + b; ^ required: Type found: int where Type is a type-variable: Type extends Integer declared in method add(Type,Type)
В первом случае компилятор знает, стертый тип и во втором случае он забывает его снова? Зачем?
Учитывая, что 'Integer' является окончательным классом, в любом случае, какая польза в том, что он имеет общий тип с ограничением' extends Integer'? Я бы не удивился, если бы язык даже не пытался поддерживать добавление между двумя значениями общего типа просто потому, что это не полезно. –