0

我有以下课程:

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

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

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

        [...]
    }

}

mapper.readValue调用通常实现为

mapper.readValue(aRequestAsText, Request.class)

如果类RequestClass是泛型的,我该如何编码?

更新 1(06.09.2013):此代码似乎有效:

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

}

你可以在这里找到相应的单元测试。

4

3 回答 3

2

尝试将objectinterface最好传递给该方法,然后您可以使用该getClass()方法或可能获取它的类instanceof

于 2013-09-05T12:23:02.687 回答
1

所以你想访问 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> {};

输出是:

Generic parameter X is bound to class java.lang.String
Generic parameter Y is bound to class java.lang.Integer

您可以强制types[i]转换为 Class。

有关更复杂的解决方案,请参阅getTypeArguments(...)

于 2013-09-05T13:05:38.257 回答
0

您可以为此查看TypeTools

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];
于 2013-10-26T02:18:24.197 回答