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
为什么起作用?编辑:
很多好的答案。谢谢大家。如果要理解的话,它的要点是,编译器可以将强制类型转换添加到
a.val - b.val
中的Integer中,因为它知道a
和b
被实例化为Nested<Integer
>。但是,由于this.val - other.val
出现在通用函数定义的主体内(此处T仍然可以是任何东西),因此编译器无法添加强制使用“-
”所需的强制类型转换。这就引出了一个更有趣的问题,即,如果Java编译器能够内联,像diff这样的通用函数是否可能起作用? 最佳答案
两者之间的区别在于您是在通用方法内部还是在通用方法之外。
您完全正确地知道T
方法内部不知道是Integer
,因此不能应用运算符减-
。但是,当您使用genet方法之外的main()
时,编译器知道您已使用Nested
实例化了Integer
,因此它非常了解如何应用运算符。即使泛型的实现已删除类型以生成Nested<T>
的代码,但编译器也没有考虑a
的b
和Nested<T>
:它具有足够的知识来插入适当的强制转换,拆箱结果并应用减号-
运算符。