gpt4 book ai didi

java - 与 Java 泛型中的类型删除规则混淆

转载 作者:行者123 更新时间:2023-11-30 07:23:44 25 4
gpt4 key购买 nike

我接触泛型已经一个小时了,我有一定的疑问。假设我有这样的类(class):

class Pair<T>
{
public T getFirst() { return first; }
}

基本上我的书是这样说的:

Type erasure: The type variables are erased and replaced by their bounding types (or Object for variables without bounds.)

所以根据我的书的陈述,JVM 中的代码应该是这样的:

 class Pair
{
public Object getFirst() { return first; }
}

现在如果我这样做:

   Pair<String> pair = new Pair<>(); //I use Java 7 diamond syntax here.
pair.getFirst()

我的代码是否需要在 getFirst 的返回类型中将 Object 转换为 String

现在考虑:

ArrayList<String> files = new ArrayList<>();

同一本书说的(相对于上面的代码是):

....the files contain array of Strings.

我对上述 ArrayList 示例中的类型删除规则感到非常困惑。在这种情况下,files 数组怎么知道它有 String 数组呢? (这与类型删除规则相矛盾)

编辑:

为了查看 Pair 的结果代码(即类型删除的发生方式),我如何在这里使用 javap 工具?

我是不是漏掉了什么?

最佳答案

你的困惑来自编译器做什么和 JVM 做什么。

Pair<String> pair = new Pair<>(); //I use Java 7 diamond syntax here.
String first = pair.getFirst();

在 JVM 中等同于

Pair pair = new Pair(); 
String first = (String) pair.getFirst();

以 Map.get() 为例

Map<Key, Value> map = ...
Value value = map.get(key);

在 JVM 中

Map map = ...
Value value = (Value) map.get(key);

Is that again my code need to convert from Object to String in return type of getFirst?

没有发生转换。对象没有改变。所发生的只是可能会对引用进行转换检查。

In order to see the resulting code of Pair(that is how type erasure have taken place), how can I use javap tool here?

使用 javap -c -classpath 。类使用对

关于java - 与 Java 泛型中的类型删除规则混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11863389/

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