1

用于实例的“输入”类型是否可能MyClass<Input>实际上是Integer我现在正在运行的这个实例?例如,我有:

class MyProcessor<Input, Output> {

  public void initialize() {
    if (Long.class.isAssignableFrom(Input.class))
    ....
  }
}

IntelliJ 告诉我不能在“Input.class”上“从类型变量中选择”。

4

3 回答 3

4

您找不到泛型类型,因为有关它的信息在运行时丢失

它只是用于在模板类上进行强制转换的提示。

于 2012-09-18T22:34:22.050 回答
1

如果您愿意通过构造函数传递类型,那么您可以在字段中保留该类型,例如

public class MyClass<T> {
    private final Class<T> clazz;

    ...

    public MyClass(Class<T> clazz, ...) {
        this.clazz = clazz;
        ...
    }

    ...

    public void initialize() {
        if (Long.class.isAssignableFrom(clazz)) 
        ....
    }

}

除此之外,由于类型擦除,信息被丢弃

于 2012-09-18T22:36:45.647 回答
0

我似乎已经找到了针对与先前答案相矛盾的特定案例的解决方案。这是代码(有效):

interface Processor<I,O>
{
  public O process();
}

abstract class SimpleProcessImpl<I,O> implements Processor<I,O>
{
  List<Processor> _upstream = new ArrayList<Processor>();

  @SuppressWarnings("unchecked")
  public I getInput()
  {
    Object value = _upstream.get(0).process();

    ParameterizedType t = (ParameterizedType) getClass().getGenericSuperclass();
    Class dstClass = (Class) t.getActualTypeArguments()[0];
    Class srcClass = value.getClass();

    System.out.println(srcClass.getName() + " -> " + dstClass.getName());

    if (dstClass == String.class && srcClass == String.class) {
      return (I) value;
    }

    if (dstClass == String.class) {
      return (I) value.toString();
    }

    if (srcClass == String.class && dstClass == Integer.class) {
      String valueStr = (String) value;
      Integer valueInt = Integer.parseInt(valueStr);
      return (I) valueInt;
    }

    if (srcClass == String.class && dstClass == Long.class) {
      String valueStr = (String) value;
      Long valueInt = Long.parseLong(valueStr);
      return (I) valueInt;
    }

    return (I) value;
  }
}
于 2012-09-19T22:15:26.393 回答