如何获取泛型函数体中的实际类型?

时间:2015-07-31 03:16:38

标签: java generics type-parameter

以下是代码:

public <K, T> Map<K, T> method1(Map<K, T> map, Class<T> entityClass){
    //I need the Class instance of the actual type T here; 
    String name = entityClass.getClass().getName();
    return map;
}

entityClass中的method1参数是多余的吗?我可以从传递给此函数的地图实例中获取该信息吗?

像这样:

public <K, T> Map<K, T> method2(Map<K, T> map){
    //Can I get T's actual type without that additonal parameter `Class<T> entityClass` ?
    //I think this information is alreay provided by the map instance passed in by the caller.
    //But I don't know how or even whether it is possible.
    return map;
}

1 个答案:

答案 0 :(得分:1)

entityClass参数是必需的。所有泛型类型信息在编译时都会被丢弃。 (这称为Type Erasure。)在编译器生成的字节码中,所有泛型类型都被其边界替换,如果它们是无界的,则由Object替换(如K和{{1在您发布的代码中。)

无法在运行时恢复此丢弃的信息。这就是在需要实际类型信息时总是使用额外类型参数(如T)的原因。