我们的想法是定义一个可以调用在类中定义的方法的基类,但是在创建时我想确保这些方法完全根据需求定义,即方法只接受一个参数, 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));
}
答案 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吗?)