gpt4 book ai didi

Java - 泛型类型 - 类型删除

转载 作者:搜寻专家 更新时间:2023-11-01 02:12:50 24 4
gpt4 key购买 nike

在oracle网站上找到了如下问答

类型删除后转换为以下类的是什么?

public class Pair<K, V> {

public Pair(K key, V value) {
this.key = key;
this.value = value;
}

public K getKey(); { return key; }
public V getValue(); { return value; }

public void setKey(K key) { this.key = key; }
public void setValue(V value) { this.value = value; }

private K key;
private V value;
}

回答:

public class Pair {

public Pair(Object key, Object value) {
this.key = key;
this.value = value;
}

public Object getKey() { return key; }
public Object getValue() { return value; }

public void setKey(Object key) { this.key = key; }
public void setValue(Object value) { this.value = value; }

private Object key;
private Object value;
}

但是当我使用 JD-GUI 反编译类文件时,我仍然看到所有泛型类型与我在实际源代码中所拥有的相似。

这是否意味着泛型类型保留在类文件中?我正在使用 Java 6。

使用JD-GUI的类的反编译版本如下。我正在使用 Eclipse Helios 编译该类。

public class Pair<K, V>
{
private K key;
private V value;

public Pair(K key, V value)
{
this.key = key;
this.value = value;
}
public K getKey() {
return this.key; }
public V getValue() { return this.value; }
public void setKey(K key) {
this.key = key; }
public void setValue(V value) { this.value = value;
}
}

最佳答案

.class 文件中保留了一些泛型类型信息——足以让您通过反射确定类型 Pair 是泛型,以及对于具有 Pair 成员的类,泛型参数的类型是什么等等在。保留此信息的事实构成了 super type tokens 等技术的基础。允许您传递保留有关其通用参数信息的类型标记。

然而,在反射之外,类型删除意味着 Pair 类的行为主要与 Oracle 网站“答案”中的剥离版本相同。特别是,方法的实际字节码不会引用泛型类型 KV - 只有 Object,方法签名将接受并返回 Object

在这种情况下,JD-GUI 只是聪明地使用存储在 .class 文件中的信息来恢复反编译输出中的通用信息,但请确保字节码中的类型已被删除。

关于Java - 泛型类型 - 类型删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14077627/

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