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;
}
}
上面的代码工作正常。但是,如果我向嵌套添加一个方法:
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 ina.val - b.val
因为它知道a
并且b
被实例化为 as 。但是,由于发生在泛型函数定义的主体内(其中 T 仍然可以是任何东西),编译器无法添加使 " " 工作所需的强制转换。这就引出了一个更有趣的问题,即如果 Java 编译器能够内联,那么像 diff 这样的泛型函数是否可以工作?Nested
<Integer
>this.val - other.val
-