繁体   English   中英

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

[英]Java: How to check generic class type definitions?

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

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

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

实际上,存在类型擦除但它不适用于变量/字段 - 仅适用于类型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()));
}    

你不能。 Java泛型类型由编译器“擦除”,即HashMap<String, String>在运行时变为HashMap 看到这个问题。

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

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

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

然后检查将静态完成。

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

(还有理由要求HashMap只是Map吗?)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM