なぜinstanceofはの使用は許可されていませんが、Class.isInstance()はジェネリックで許可されていますか?

アリーナ:

私はThinkingInJavaからジェネリック医薬品について読んと、このコードスニペットを見つけました。

public class Erased<T> {
  private final int SIZE = 100;
  public void f(Object arg) {
    if(arg instanceof T) {}          // Error
    T var = new T();                 // Error
    T[] array = new T[SIZE];         // Error
    T[] array = (T)new Object[SIZE]; // Unchecked warning
  }
}

私は、消去の概念を理解し、私は、実行時に、Tにはタイプが存在しないことを知っていて、それが(だったか、上限何でも)実際のオブジェクトと考えられています

しかし、なぜそれがコードの作品のこの作品は、ということです

public class ClassTypeCapture<T> {
      Class<T> kind;
      public ClassTypeCapture(Class<T> kind) {
        this.kind = kind;
      }
      public boolean f(Object arg) {
        return kind.isInstance(arg);
      }
}

我々としても、我々はこのような書き込みは何もすることはできませんので、理由消去我々は、実行時にTの種類を知っていないことをここに同じ引数を適用するべきではないでしょうか。それとも私はここで何かが足りないのですか?

glglgl:

あなたの例では、T実際に消去されます。あなたは合格としてではなくkind、与えられたタイプのクラスオブジェクトがある、それが完全に言わチェックのために使用することができます。

あなたはこのクラスを使用するときに何が起こるか見て:

ClassTypeCapture<String> capture = new ClassTypeCapture<>(String.class);

ここでは、クラスのオブジェクトは、Stringそれから、新しいオブジェクトを作成し、指定されたコンストラクタに渡されます。

クラス消去時には、情報TではString失われていますが、まだ持っています

ClassTypeCapture capture = new ClassTypeCapture(String.class);

これはString.class保持され、オブジェクトにはよく知られています。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=477349&siteId=1