用于实例的“输入”类型是否可能MyClass<Input>实际上是Integer我现在正在运行的这个实例?例如,我有:
class MyProcessor<Input, Output> {
  public void initialize() {
    if (Long.class.isAssignableFrom(Input.class))
    ....
  }
}
IntelliJ 告诉我不能在“Input.class”上“从类型变量中选择”。
用于实例的“输入”类型是否可能MyClass<Input>实际上是Integer我现在正在运行的这个实例?例如,我有:
class MyProcessor<Input, Output> {
  public void initialize() {
    if (Long.class.isAssignableFrom(Input.class))
    ....
  }
}
IntelliJ 告诉我不能在“Input.class”上“从类型变量中选择”。
您找不到泛型类型,因为有关它的信息在运行时丢失。
它只是用于在模板类上进行强制转换的提示。
如果您愿意通过构造函数传递类型,那么您可以在字段中保留该类型,例如
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)) 
        ....
    }
}
除此之外,由于类型擦除,信息被丢弃
我似乎已经找到了针对与先前答案相矛盾的特定案例的解决方案。这是代码(有效):
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;
  }
}