gpt4 book ai didi

java - 类型参数不起作用吗?

转载 作者:搜寻专家 更新时间:2023-10-31 20:32:39 25 4
gpt4 key购买 nike

假设我有一个通用类 Parcel 和一个通用方法 deliver,如下面的代码所示。该方法打印并返回 x,它在方法内部分配了一个类型参数 Integer。

public class Parcel<T> {
public <X> X deliver(){
X x = (X) new Integer(100);
System.out.println(x);
return x;
}
}

在 main 中,我通过传递类型参数 Parcel 来调用方法 deliver。但是它仍然打印 100。

public static void main(String args[]) {
Parcel<String> parcel = new Parcel<>();
System.out.println(parcel.<Parcel> deliver());
}

这表明在打印行中传递的类型参数 Parcel 没有任何作用,我预计这里会出现异常。它是如何工作的?

最佳答案

你观察到的叫做type erasure .编译器使用通用参数来确保类型正确性,并且不会出现在运行时。

一般来说,没有什么能阻止你这样做:

List<Integer> list = new ArrayList<>();
list.append(""); // produces compiler error

// just drop that "useless" generic argument
List erased = (List) list;
erased.append(""); // works fine

编辑

其实我最初的回答偶尔是针对这个 Parcel实现

public class Parcel<T> {
public T deliver(){
T x = (T) new Integer(100);
System.out.println(x);
return x;
}
}

但是 <X> X deliver() 的关键思想是相同的:

Object parcel = parcel.<Parcel> deliver(); // erased, works ok
Parcel parcel = parcel.<Parcel> deliver(); // java.lang.ClassCastException

关于java - 类型参数不起作用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38434705/

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