Eclipse自动完成 - 当只有二进制jar可用时,它如何知道泛型?

Ele*_*naT 11 java eclipse generics autocomplete jar

使用类型擦除实现Java泛型.这意味着如果我有一个方法:

public void setMapParam(Map<String, Integer> p) { ... }
Run Code Online (Sandbox Code Playgroud)

在编译之后,它将最终在.class中:

public void setMapParam(Map p) { ... }
Run Code Online (Sandbox Code Playgroud)

我有一个JAR文件,其中包含如上所述的泛型类和方法.它只是二进制文件.没有源代码也没有.

但是当我在代码中使用它时,Eclipse自动完成功能让我setMapParam(Map<String, Integer> p)即使在二进制文件中也是如此setMapParam(Map p).

Map<String, Integer>即使方法签名已被删除(to Map),Eclipse现在如何使用type()?或者我错过了什么?

Mic*_*rdt 17

类型擦除并不能意味着编译后的代码不包含任何类型的参数信息.类和成员定义中使用的类型参数存在于已编译的代码中,并可通过反射获得(请参阅参考资料TypeVariable).

什么类型的擦除意味着对象实例没有单独的类型参数.给定类定义MapImpl extends HashMap<T extends Comparable, Integer>和该类的实例,您无法找出T在创建实例的代码中使用了哪个特定值,因为该信息不存在.但是你可以发现它extends Comparable和值类型是Integer,因为该信息是类定义的一部分(并由所有实例共享).


Jon*_*eet 7

不,参数保留其通用类型信息.

例如,类型擦除是关于List<T>不知道什么T是执行时间的实例.实际上只有一个List类 - 其余的由编译器决定.但编译器可以使用有关参数类型和类型本身的信息.

这是一个例子:

import java.util.*;
import java.lang.reflect.*;

public class Test {

    public void foo(List<String> list) {
    }

    public static void main(String[] args) throws Exception{
        Method method = Test.class.getMethod("foo", List.class);
        Type parameterType = method.getGenericParameterTypes()[0];
        System.out.println(parameterType);
    }
}
Run Code Online (Sandbox Code Playgroud)

打印出:

java.util.List<java.lang.String>
Run Code Online (Sandbox Code Playgroud)

因此,类型信息已保留在方法的元数据中.