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中,因为它知道ab被实例化为Nested<Integer>。但是,由于this.val - other.val出现在通用函数定义的主体内(此处T仍然可以是任何东西),因此编译器无法添加强制使用“-”所需的强制类型转换。这就引出了一个更有趣的问题,即,如果Java编译器能够内联,像diff这样的通用函数是否可能起作用?

最佳答案

两者之间的区别在于您是在通用方法内部还是在通用方法之外。

您完全正确地知道T方法内部不知道是Integer,因此不能应用运算符减-。但是,当您使用genet方法之外的main()时,编译器知道您已使用Nested实例化了Integer,因此它非常了解如何应用运算符。即使泛型的实现已删除类型以生成Nested<T>的代码,但编译器也没有考虑abNested<T>:它具有足够的知识来插入适当的强制转换,拆箱结果并应用减号-运算符。

07-28 01:40
查看更多