如何在运行时确定通用对象的声明类型?

时间:2011-11-15 13:11:37

标签: java generics

HashMap<String, Boolean> myMap = new HashMap<String, Boolean>(); 
System.out.println(func1(myMap)); //should print "HashMap<String, Boolean>"

我想知道是否有这样的功能。此函数应该获取一个对象并返回该对象的确切类型。它应该适用于所有集合。

5 个答案:

答案 0 :(得分:3)

这是不可能的,此信息在运行时不可用。 Java中存在“类型擦除”。 http://download.oracle.com/javase/1,5.0/docs/guide/language/generics.html

答案 1 :(得分:2)

泛型信息在运行时被删除。 println在运行时运行。在运行时,地图只是一个HashMap。

答案 2 :(得分:2)

不幸的是,没有。
您可以使用反射找到它是HashMap,但由于类型擦除,您将无法找到类型参数。

来自Wikipedia

  

在编译时检查泛型的类型正确性。然后在称为类型擦除的过程中移除泛型类型信息。例如,List<Integer>将转换为非泛型类型List,它可以包含任意对象。编译时检查可确保生成的代码是类型正确的。

     

由于类型擦除,无法在运行时确定类型参数。

答案 3 :(得分:0)

由于类型擦除,这是完全不可能的。在运行时,对象的类型参数将被擦除,并且仅在它们被使用时作为强制转换存在。如果它们是具体的,可以通过反射检索字段和方法的类型参数。

答案 4 :(得分:0)

如果地图至少有一个条目,则可以使用一个技巧 如下

    Map<String, Boolean> map = new HashMap<String, Boolean>();
    System.out.println(map.getClass().getName());
    Set set = map.entrySet();
    for (Object object : set) {
        Map.Entry e = (Entry) object;
        System.out.println(e.getKey().getClass());
        System.out.println(e.getValue().getClass());
    }