当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Java:如何检查泛型类的定义?》经验,为你挑选了2个好方法。

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

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

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

Itay Maman.. 12

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

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

class Z
{
  public void f(List 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()));
}    


Dave Ray.. 7

你不能.Java泛型类型由编译器"擦除",即HashMap变为HashMap运行时.看到这个问题.



1> Itay Maman..:

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

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

class Z
{
  public void f(List 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()));
}    



2> Dave Ray..:

你不能.Java泛型类型由编译器"擦除",即HashMap变为HashMap运行时.看到这个问题.

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有