1

ご挨拶。これは、このサイトでの私の最初の投稿です。

タイプ eraserのため、次のコードがコンパイルされることは期待できないと思いました。実際、以前のバージョンの Eclipse ではコンパイルされませんでした。私の理解では、instanceofは実行時の演算子であり、実行時にコンパイルされるジェネリック型について知ることができませんでした。

   public static <E extends Comparable<? super E>> 
   void SampleForQuestion(E e)
   {
      if ( !(e instanceof String) )
         System.out.println("I am not a String");
      else
         System.out.println("I am  a String");
   }

しかし、あなたのスレッドの 1 つに実際にこのようなコードが回答に含まれているのを見て驚きました。私の最新の Eclipse (JVM 1.6 rev 20 を搭載した Windows 上の Galileo) はそれに完全に満足しており、それも機能します。(誰かがEclipseでは動作したが、そのスレッドの別のIDE / JDKでは動作しないと言ったことに気付きましたが、詳細は覚えていません。)

誰かがそれが機能する理由を説明できますか?さらに重要なことは、将来的に機能することが期待されるかどうか、学生を指導する必要があるためです.

ありがとうございました。(コードの書式設定が正しく行われることを願っています。私の観点からは正しくインデントされているように見え、タブはありません。)

4

3 に答える 3

4

消去されるのはEです。if (e instanceof E)型パラメータEが消去されているため、実際にはできません。ただし、Stringパラメーター化された型ではなくe、実行時の型があるため、問題なくif (e instanceof String)動作します。

JLS 15.20.2 型比較instanceof演算子

RelationalExpression:
    RelationalExpression instanceof ReferenceType

RelationalExpression演算子のオペランドの型はinstanceof、参照型または型でなければなりませんnull。そうしないと、コンパイル時エラーが発生します。演算子のReferenceType後にあるinstanceofは、参照型を示す必要があります。そうしないと、コンパイル時エラーが発生します。演算子の後に言及されたが具体化可能な型を示さない場合、コンパイル時エラーになります (§4.7)。ReferenceType instanceof

String再定義可能なタイプです。Eではありません。

JLS 4.7 Reifiable 型

一部の型情報はコンパイル中に消去されるため、実行時にすべての型が使用できるわけではありません。実行時に完全に使用できる型は、reifiable 型と呼ばれます。次のいずれかが成り立つ場合に限り、型は具体化可能です。

  • 非ジェネリック型宣言を参照しています。
  • すべての型引数が無制限のワイルドカードであるパラメーター化された型です
  • 生タイプです。
  • プリミティブタイプです。
  • コンポーネント型が具体化可能な配列型です。

こちらもご覧ください

于 2010-05-08T03:05:40.397 に答える
3

それはうまくいきます。取るメソッドE eは としてコンパイルされComparable eますが、実行時に存在する型に対するチェックを妨げません(Stringあなたの例では)。できないのは、型が実行時に存在するが存在しないArrayList<String>ため、(または独自のクラスの一般的な特殊化) のようなものをチェックすることです。したがって、人々はリストの最初の要素をチェックするようなハックを使用します。ArrayListArrayList<String>

于 2010-05-08T02:53:44.230 に答える
2

小文字の e はオブジェクトであり、すべてのオブジェクトにはその型があります。任意のオブジェクトで instanceof を確認できます。コードを別の名前で読むと、簡単に取得できます。

   public static <E extends Comparable<? super E>> 
   void SampleForQuestion(E paramObject)
   {
      if ( !(paramObject instanceof String) )
         System.out.println("I am not a String");
      else
         System.out.println("I am  a String");
   }
于 2010-05-08T03:55:36.240 に答える