Java:如何检查泛型类的定义?

时间:2009-01-20 12:32:04

标签: java generics types

我们的想法是定义一个可以调用在类中定义的方法的基类,但是在创建时我想确保这些方法完全根据需求定义,即方法只接受一个参数, HashMap <String String&gt;。

到目前为止,我能够使用以下代码检查该方法是否只包含一个参数,并且它是Class HashMap,但是如何检查通用定义是<String, String&gt; ?

public boolean isMethodParameterValid(final Method method) {
  final Class<?>[] parameters = method.getParameterTypes();
  return ((parameters.length == 1) && parameters[0].isAssignableFrom(HashMap.class));
}

4 个答案:

答案 0 :(得分:12)

实际上,存在类型擦除但它不适用于变量/字段 - 仅适用于类型params被擦除并用其上限替换的类的定义。

这意味着您可以实现所要求的。以下是如何检查方法的第一个参数的通用参数:

class Z
{
  public void f(List<String> lst) { }
}

...

Method m = Z.class.getMethod("f", List.class);
Type t = m.getGenericParameterTypes()[0];
if(t instanceof ParameterizedType) {
  ParameterizedType pt = (ParameterizedType) t;
  System.out.println("Generic params of first argument: " + Arrays.toString(pt.getActualTypeArguments()));
}    

答案 1 :(得分:7)

你做不到。 Java泛型类型由编译器“擦除”,即HashMap<String, String>在运行时变为HashMap。请参阅this问题。

答案 2 :(得分:1)

我真的不明白你想要做的目标。我有一种感觉,应该可以通过仔细设计您的类层次结构来在编译时检查它。但是如果没有关于你试图解决的问题的更多细节,我无法帮助你。

答案 3 :(得分:1)

如上所述,在运行时,您无法查看类型的通用部分。

您是否有理由在模板模式中定义抽象方法?

然后检查将静态完成。

protected abstract void process(HashMap<String, String>);

(还有理由要求只使用地图上的HashMap吗?)