gpt4 book ai didi

java - 为什么 Java 的类型删除没有打破这个?

转载 作者:搜寻专家 更新时间:2023-10-30 19:55:25 25 4
gpt4 key购买 nike

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工作?

编辑:

很多好的答案。感谢大家。如果我理解正确的话,它的要点是编译器可以在 a.val - b.val 中向 Integer 添加强制转换。因为它知道ab被实例化为 Nested<code><Integer</code>> .然而,由于 this.val - other.val发生在通用函数定义的主体内部(其中 T 仍然可以是任何东西),编译器无法添加使“-”工作所必需的强制转换。这就引出了一个更有趣的问题,即,如果 Java 编译器能够内联,像 diff 这样的通用函数是否可以工作?

最佳答案

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

在方法T 中你完全正确不知道是 Integer , 所以运算符减去 -不能应用。然而,当你在 main() , 在泛型方法之外,编译器知道你已经实例化了 NestedInteger ,所以它很清楚如何应用运算符。即使泛型的实现已经删除类型以生成 Nested<T> 的代码, 编译器不会想到 abNested<T> 方面:它有足够的知识来插入适当的类型转换,拆箱结果,并应用减号 -运营商。

关于java - 为什么 Java 的类型删除没有打破这个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18028687/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com