質問があり、検索したところ、多くの回答が得られました。どちらが本当かわかりませんでした。どなたか説明お願いします。タグ付きインターフェースがJVMによって特別に処理されるのはなぜですか? 例: メソッドを持たないシリアル化可能なインターフェイスを使用できますが、JVM はコンパイル時の例外をスローしません。JVMがそのような種類のインターフェースをどのように扱うか、タグ付きインターフェースを実装するとどうなるか。
4 に答える
jvmにとって特別なことは何もありません。メソッドを定義するためにインターフェイスは必要ありません。実行時に instanceof で簡単に確認できる特定の型としてクラスにラベルを付ける方法として、空のインターフェイスを実装するクラスを考えてみてください。
この型情報に加えて、クラスの高レベルの側面を強調したり、特定のプロパティを持つクラスをすばやく識別したりするためにも使用できます (人間と自動化されたツールまたは IDE の両方によって)。
ほとんどの場合、「マーカー」インターフェースは、JVM ではなく、開発者と開発者が作成するライブラリによって区別されます。
タグ付きインターフェースがJVMによって特別に処理されるのはなぜですか?
そうではありません。メソッドのないインターフェースには、特別な動作はありません。これらのインターフェイスは、特定の目的のためにライブラリ設計者によって特別に使用されます。
例: メソッドを持たないシリアル化可能なインターフェイスを使用できますが、JVM はコンパイル時の例外をスローしません。
後者は、JVM が Serializable インターフェイスの特別な動作を認識していないことを示唆しています。代わりに、ObjectInputStream/ObjectOutputSTreamライブラリがチェックするもの、それ以上のものです。他のシリアル化ライブラリは、このインターフェイスで何かを行う場合としない場合があります。たとえば、XStream はそれを無視します。
JVMがそのような種類のインターフェースをどのように扱うか、タグ付きインターフェースを実装するとどうなるか。
JVM が認識しているシリアライズ可能な唯一の点は、組み込みの配列型がシリアライズ可能であることです。
System.out.println(new byte[0] instanceof Serializable); // is true
これは、どのクラスでも定義されていないため、JVM がこの型を Serializable にする必要があることを認識しているためにのみ機能します。これは、他のマーカー インターフェイスには当てはまらない特殊なケースです。
インターフェイスにメソッドがない場合にjvmが例外をスローする理由はわかりません。マーカーインターフェイスを使用すると、タイプ固有の実装が可能になります。マーカーインターフェイスタイプ固有のカスタマイズ(のインスタンス)をチェックして実行できます。JVMは同様のことをしている必要があります。
ただし、アノテーション(Java 5以降)は、マーカーインターフェイスのより良い代替手段です。
タグ付きまたはマーカー インターフェースが JVM によって特別に扱われる理由
そうではありません。「タグ付き」の意味がわかりませんが、違いはありません。
タグ付きインターフェースがJVMによって特別に処理されるのはなぜですか?
そうではありません。
例: メソッドを持たないシリアル化可能なインターフェイスを使用できますが、JVM はコンパイル時の例外をスローしません。
バグのあるコンパイラがない限り、コンパイル時の例外などはありません。1997 年以来、私は一度も見たことがありません。コンパイル エラーについて言及している場合、 JVMではなく、Java コンパイラによってスローされずに出力されます。メソッドを含まないインターフェースに対してコンパイルエラーが出力されない理由を尋ねている場合、その理由はそれが正当な Java コードであるためです。Java 言語仕様を確認してください。
JVM がそのような種類のインターフェースを扱う方法
他のインターフェースと同じです。
タグ付けされたインターフェースを実装するとどうなるか。
「タグ付き」の意味がわかりませんが、他のインターフェースと同じです。
この混乱の中であなたが本当に求めているのは「Serializable
インターフェースはどのように機能するのか」ということでしょうか? 答えは、ObjectOutputStream
クラスは、渡されたオブジェクトが をObjectOutputStream.writeObject()
実装するクラスのものであることを演算子Serializable
を介してチェックすることです。instanceof
それでおしまい。コンパイラや JVM による処理はなく、自分で記述できるのとまったく同じ種類のコードです。