【问题标题】:Java: How to check generic class type definitions?Java:如何检查泛型类类型定义?
【发布时间】:2009-01-20 12:32:04
【问题描述】:

这个想法是定义一个可以调用派生类中定义的方法的基类,但是在创建时我想确保这些方法是完全按照要求定义的,即方法只接受一个参数, HashMap<String String>.

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

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

【问题讨论】:

    标签: java generics types


    【解决方案1】:

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

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

    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()));
    }    
    

    【讨论】:

    • 是的。如果你有一个类的实例,在运行时你不能询问它的泛型类型参数可能是什么。如果您对可能使用泛型类型参数定义的方法、类或字段具有反射句柄,则可以使用反射方法来确定这些泛型参数是什么——它们是类型、通配符、类型变量等。
    【解决方案2】:

    你不能。 Java 泛型类型被编译器“擦除”,即HashMap&lt;String, String&gt; 在运行时变为HashMap。请参阅this 问题。

    【讨论】:

    • 并非所有类型都被删除。另一个例子是new ArrayList&lt;String&gt;{}。 Neal Gafter 的 Super Type 代币帖子也值得一读:gafter.blogspot.com/2006/12/super-type-tokens.html
    • 不,Neals Gafter 的超类型标记在编译时被删除。他的技巧有助于在运行时访问用于实例化泛型的 Type(因为 Type.getClass() 已授权)。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      如前所述,在运行时您无法查看类型的泛型部分。

      你有什么理由可以像在模板模式中那样定义一个抽象方法吗?

      然后静态检查。

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

      (也有理由要求 HashMap 而不是 Map?)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-21
        • 2010-09-18
        • 1970-01-01
        • 1970-01-01
        • 2012-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多