6

我在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;
  }
}
4

1 回答 1

7

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

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

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

于 2012-12-29T00:51:56.793 回答