gpt4 book ai didi

java - 类型参数是否与参数一起传递给方法?

转载 作者:行者123 更新时间:2023-12-04 08:01:01 24 4
gpt4 key购买 nike

根据我自己的实验,我得出结论,当作为参数传递给方法时,对象或对象引用的任何类型参数都会被剥离。如果方法的参数使用类型参数进行参数化,则会弹出类型参数的问题:

<T> void method (ArrayList<T> list) {
list.add( (T) new Integer(4));
sysout (list.get(0));
}
然后,如果我们将两个参数化的 ArrayList 中的每一个传递给此方法的调用:
method(new ArrayList<Integer>());
method(new ArrayList<String>());
我们将看到两者都不会产生错误并且都打印 4。我假设编译器保留了 T 的删除。如 Object .这个实验不能证明类型参数没有传递给方法吗?

最佳答案

ArrayList<T>的案例真的和普通的情况一样T .在这两种情况下,T在编译时用于静态类型检查。但是,在运行时,T被删除。
看你贴的代码,编译后的方法等价于这个:

void method (ArrayList<Object> list) {
list.add( (Object) new Integer(4));
sysout (list.get(0));
}
调用是有效的:
method(new ArrayList<Object>());
method(new ArrayList<Object>());
因此,从运行时的角度来看,您正在存储 ObjectArrayList<Object> ,这很好。
现在,如果没记错的话,您应该会收到有关表达式 (T) new Integer(4) 的未经检查的强制转换的警告。 .这是一个需要注意的好警告!如果目标类型与实际类型不兼容,转换通常会抛出异常。但是,在这种情况下, T在运行时不存在,因此无法动态检查 - 强制转换是空操作。但是,如果我们修改示例以返回强制转换的值,您会在运行时开始看到问题:
<T> T method (ArrayList<T> list) {
T value = (T) new Integer(4);
list.add(value);
return value;
}
进而
String result = method(new ArrayList<String>());
即使转换成功(它只是一个空操作),当返回值分配给 result 时也会抛出异常。因为值是 Integer而不是 String .

关于java - 类型参数是否与参数一起传递给方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66468494/

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