微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java获得第二种泛型类型

如何解决Java获得第二种泛型类型

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

抽象类采用两种通用类型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<>();
    }
}

解决方法

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

您的方法签名如下:public final Class<?> getTypeParam()

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

因此:您必须确定自己实际想要/需要的东西。有多种解决方案,例如:

  • public final Class<?> getFirstParam() ...始终返回索引0
  • public final Class<?> getSecondParam() ...始终返回索引1(对于只有1个泛型类型参数的类,显然会失败)
  • public final List<Class<?>> getParams() ...返回包含所有条目的列表

这是您的选择空间。选择哪种解决方案完全取决于该方法的目的(我们什么都不知道)。

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

,

更改脱节:

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

现在,这将导致第二个泛型:

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

输出为:

class java.lang.Boolean

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。