Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取Java泛型的类对象?_Java_Generics - Fatal编程技术网

如何获取Java泛型的类对象?

如何获取Java泛型的类对象?,java,generics,Java,Generics,我有以下课程: public abstract class AbstractService<PersistenceClass extends IPersistence, RequestClass, ResponseClass> { public String processRequest(final String aRequestAsText) { [...] final RequestClass request = map

我有以下课程:

public abstract class AbstractService<PersistenceClass extends IPersistence,
    RequestClass, ResponseClass> {

    public String processRequest(final String aRequestAsText)
    {
        [...]

        final RequestClass request = mapper.readValue(aRequestAsText, 
            RequestClass);

        [...]
    }

}
如果类RequestClass是泛型的,我如何编写它

更新1(2013年9月6日):此代码似乎有效:

public class GenericTypeBindigsFinder implements IGenericTypeBindigsFinder {

    @SuppressWarnings("rawtypes")
    @Override
    public List<Class> getGenericTypes(final Class aClass) {
        final List<Class> result = new LinkedList<Class>();

        final ParameterizedType gen = (ParameterizedType) aClass.getGenericSuperclass();

        final Type [] types = gen.getActualTypeArguments();

        for (int i = 0; i < types.length; i++) {
            if (types[i] instanceof Class)
            {
                final Class clazz = (Class)types[i];
                result.add(clazz);
            }
        }

        return result;
    }

}
公共类GenericTypeBindigsFinder实现IGenericTypeBindigsFinder{
@抑制警告(“原始类型”)
@凌驾
公共列表getGenericTypes(最终类aClass){
最终列表结果=新建LinkedList();
最终参数化类型gen=(参数化类型)aClass.getGenericSuperclass();
最终类型[]类型=gen.getActualTypeArguments();
for(int i=0;i

您可以找到相应的单元测试。

尝试将
对象
接口
最好传递给该方法,然后您可以使用
getClass()
方法或
实例
尝试将
对象
接口
最好传递给该方法,然后,您可以使用
getClass()
方法或者
instanceof

获取它的类,因此您希望访问AbstractService中绑定的泛型类型。你可以通过反射来实现。请参见此处的示例代码:

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;

public class GenericClass extends GenericSuper<String, Integer> {
  public GenericClass() {
    ParameterizedType gen = (ParameterizedType) getClass().getGenericSuperclass();
    TypeVariable<?> typeVars[] = getClass().getSuperclass().getTypeParameters();
    Type [] types = gen.getActualTypeArguments();
    for (int i = 0; i < typeVars.length; i++) {
      System.out.println("Generic parameter " + typeVars[i] + 
                         " is bound to " + types[i]);
    }
  }

  public static void main(String[] args) {
    new GenericClass();
  }
}

class GenericSuper<X, Y> {};
您可以将
类型[i]
强制转换为类


有关更复杂的解决方案,请参阅。

,以便访问AbstractService中绑定的泛型类型。你可以通过反射来实现。请参见此处的示例代码:

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;

public class GenericClass extends GenericSuper<String, Integer> {
  public GenericClass() {
    ParameterizedType gen = (ParameterizedType) getClass().getGenericSuperclass();
    TypeVariable<?> typeVars[] = getClass().getSuperclass().getTypeParameters();
    Type [] types = gen.getActualTypeArguments();
    for (int i = 0; i < typeVars.length; i++) {
      System.out.println("Generic parameter " + typeVars[i] + 
                         " is bound to " + types[i]);
    }
  }

  public static void main(String[] args) {
    new GenericClass();
  }
}

class GenericSuper<X, Y> {};
您可以将
类型[i]
强制转换为类

有关更复杂的解决方案,请参阅。

您可以查看以下内容:

Class<?>[] typeParams = TypeResolver.resolveRawArguments(AbstractService.class, getClass());
Class<PersistenceClass> persistenceClass = (Class<PersistenceClass>)typeParams[0];
Class<RequestClass> requestClass = (Class<RequestClass>)typeParams[1];
Class<ResponseClass> responseClass = (Class<ResponseClass>)typeParams[2];
Class[]typeParams=TypeResolver.resolveRawArguments(AbstractService.Class,getClass());
类persistenceClass=(类)类型参数[0];
类requestClass=(类)类型参数[1];
类responseClass=(类)类型参数[2];
您可以查看以下内容:

Class<?>[] typeParams = TypeResolver.resolveRawArguments(AbstractService.class, getClass());
Class<PersistenceClass> persistenceClass = (Class<PersistenceClass>)typeParams[0];
Class<RequestClass> requestClass = (Class<RequestClass>)typeParams[1];
Class<ResponseClass> responseClass = (Class<ResponseClass>)typeParams[2];
Class[]typeParams=TypeResolver.resolveRawArguments(AbstractService.Class,getClass());
类persistenceClass=(类)类型参数[0];
类requestClass=(类)类型参数[1];
类responseClass=(类)类型参数[2];

您想从泛型声明中检索类型参数吗?不,我想获取
RequestClass
(有点像
RequestClass.class
)的类对象。@DmitriPisarenko:请不要对非代码使用反勾号,请参见例如
request.getClass()
应该可以帮您解决这个问题,正如@ragatskynet在下面回答的那样。@Mauren看到了我对ragatskynet答案的评论。你想从泛型声明中检索类型参数吗?不,我想获取
RequestClass
(排序为
RequestClass.class
)。@Dmitrisarenko:请不要对非代码使用反勾号,请参见例如
request.getClass()
应该可以帮你,正如@ragatskynet在下面回答的那样。@Mauren请看我对ragatskynet答案的评论。我需要RequestClass类来创建它的实例。所以我不能用你的解决方案。基本上,这是JSON解析——mapper获取一个文本并生成一个表示该文本的请求对象。为此,它需要请求的类。在这种情况下,您应该尝试使用工厂模式来创建所需的类。简单的多态性就足够了,不需要泛型。这里有一篇关于这方面的小文章(当然,您可以找到许多其他参考资料):我需要RequestClass类来创建它的实例。所以我不能用你的解决方案。基本上,这是JSON解析——mapper获取一个文本并生成一个表示该文本的请求对象。为此,它需要请求的类。在这种情况下,您应该尝试使用工厂模式来创建所需的类。简单的多态性就足够了,不需要泛型。这里有一篇关于这方面的小文章(当然,您可以找到许多其他资源):