【问题标题】:Java get the second generic typesJava 获取第二种泛型类型
【发布时间】:2021-02-02 06:12:06
【问题描述】:

我正在努力从对象中获取第二个泛型的类型。

抽象类有两个泛型类型 T 和 S

abstract class Concept<T, S> {
    
    public Concept() { 
     //do nothing
    }

    public final Class<?> getTypeParam() {
    
        ParameterizedType parameterizedType = (ParameterizedType) getClass().getGenericSuperclass();

        Class<?> result = (Class<?>) parameterizedType.getActualTypeArguments()[0];

        return result;
    }               
}

在这个派生类中,定义了一个(在这种情况下为 T)泛型:

public class Decision<S> extends Concept<String, S>{
    
    public Decision () {
        super();
        System.out.println(getTypeParam()); //returns the first parameterized type. How do I get the second one?
    }       
}

当我现在运行它时,我得到了第一个 parmerized 泛型。伟大的。但是我如何取出第二个呢?

public class Main {

    public static void main(String[] args){

        Decision<Boolean> myBooleanDecision = new Decision<>();
    }
}

【问题讨论】:

  • (Class&lt;?&gt;) parameterizedType.getActualTypeArguments()[1];?
  • 切勿将此类信息放入 cmets。请务必更新您的问题。这里没有人想破译来自 cmets 的堆栈跟踪...
  • 注意:Decision 类中会抛出异常。该类只有 1 个通用参数,因此您不能要求 second。例如,您应该修改您的方法以返回一个类列表,然后返回一个列表。
  • 最后:了解如何使用数组是基本的java。检查泛型类型......是非常先进的东西。看来您在基本的东西上遇到了麻烦……所以我认真地建议:暂时忘记高级的东西。首先学习基础知识。如果您不明白为什么您的代码会抛出该异常,那么这些高级主题将不适合您。
  • @GhostCat:我认为您在这里的第二条评论可以作为答案。它描述了问题并提出了解决方案......

标签: java generics reflection parameterized-types


【解决方案1】:

更改声明:

Decision<Boolean> myBooleanDecision = new Decision<>("Binary Decision") {};

现在这将产生第二个泛型:

Class<?> result = (Class<?>) parameterizedType.getActualTypeArguments()[0];

输出是:

class java.lang.Boolean

【讨论】:

    【解决方案2】:

    您的问题是基于您不清楚自己的要求这一事实。

    您的方法签名如下所示:public final Class&lt;?&gt; getTypeParam()

    但是你忽略了:你的类的类型参数的数量是不固定的。基本的 Concept 类允许 两个 类型参数,但 Decision 子类将第一个参数“固定”为 String。

    因此:你必须决定你真正想要/需要什么。有多种解决方案,例如:

    • public final Class&lt;?&gt; getFirstParam() ... 总是返回索引 0
    • public final Class&lt;?&gt; getSecondParam() ... 总是返回索引 1(对于只有 1 个泛型类型参数的类显然会失败)
    • public final List&lt;Class&lt;?&gt;&gt; getParams() ... 返回包含所有条目的列表

    那是您的选择空间。选择哪种解决方案完全取决于该方法的目的(我们对此一无所知)。

    就个人而言,我会选择第三个选项,因为它适用于 0、1、... n 类型参数,无需任何更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 2013-11-15
      相关资源
      最近更新 更多