Java泛型:从泛型对象中检索类型

时间:2020-08-31 12:02:20

标签: java generics

我有一个通用类Class1 ,它有两种类型。现在我要维护一个将String映射到Class1对象的映射,即Map 。通过Map进行迭代时是否可以检索每个Class1对象的类型(K,V)?

即让我们想到以下代码

Map<String, Class1> map;
map.put("1", Class1<String, Integer> obj1);
map.put("2", Class1<String, Double> obj2);
map.put("3", Class1<Integer, Double> obj3);

现在当我遍历地图时...我能以某种方式获得每个Class1对象的类型(K,V)吗?

1 个答案:

答案 0 :(得分:1)

根据JVM规范,这是不可能的。

泛型类型仅在编译时可用。在运行时只有Object

您只有2种选择:

  1. 将类定义变量添加到您的对象中,并在需要此信息时使用它。
  2. 例如对于List<Object>以及其他集合(如果不为空),您可以从中获取一项并获得item.getClass()

建议。购买方式,您的方法不能解决此问题。您可以实现如下接口:

interface TypeConverter {
    boolean isValid(String str);   // call it before to check if current converter valid for required transform or not

    Class1 converts(String str);  // call it to convert 
}

对于每种必需的类型,您必须创建单独的转换器(这是“策略模式”)。您的最终代码可能如下所示:

final TypeConverter converters = new ArrayList<>();
converters.add(new OneTypeConverter());
converters.add(new TwoTypeConverter());

public static Class1 convert(String str) {
    for(TypeConverter convereter : converters)
        if(converter.isValid(str))
            return converter.convert(str);
  
    throw new RuntimeException("No suitable converter found");
}