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 に答える