public class Test {
public static class Nested<T> {
public T val;
Nested(T val) { this.val = val; }
}
public static void main(String[] args) {
Nested<Integer> a = new Nested<Integer>(5);
Nested<Integer> b = new Nested<Integer>(2);
Integer diff = a.val - b.val;
}
}
Приведенный выше код работает нормально. Однако, если я добавлю метод в Nested:
T diff(Nested<T> other) { return this.val - other.val; }
Я получаю ошибку компиляции:
operator - cannot be applied to T,T
Это имеет смысл для меня. Тип T стирается во время выполнения, поэтому Java не может применить оператор, который определен только для определенных классов, таких как Integer. Но почему работает a.val - b.val
?
Изменить:
Много хороших ответов. Всем спасибо. Суть его, если я правильно понимаю, заключается в том, что компилятор может добавлять приведения в Integer в a.val - b.val
, потому что он знает a
и b
, были созданы как Nested
. Однако, поскольку <Integer
> this.val - other.val
происходит внутри тела определения общей функции (где T все еще может быть чем угодно), компилятор не может добавить приведения, которые необходимы для создания "-
". Это приводит к более интересному вопросу, а именно: если компилятор Java мог бы встраивать, можно ли использовать общую функцию, такую как diff?