2011-02-10 5 views
11

私はJVMの独自の実装に取り​​組んでおり、checkcast命令に戻ってきました。完全なドキュメントはon this pageです。キャストの仕組みのルールを列挙するときにチェックされる条件の1つが、チェック対象のオブジェクト参照がインターフェイスタイプであるかどうかが不思議です。私の理解では、これは可能ではありません。インタフェースを直接インスタンス化することはできず、インタフェースを実装するオブジェクトには、他の具体的なクラス型があります。何か不足していますか?チェックキャストバイトコード命令に混乱がありますか?

答えて

20

、このブログの記事は、説明があります。http://mbravenboer.blogspot.com/2008/12/why-jvm-spec-defines-checkcast-for.html

これは確かに `不可能」の場合であることが判明しました。 checkcastを再帰的配列のために定義されているため、この項目は、 明細書に理由がある:

  • Sが配列型SCを表すクラスである場合は、[]、すなわち、型SCの構成要素の配列、その後:
  • ...
  • T []は、それは、型TCの構成要素のアレイであるアレイ型TCであれば、次のいずれかが真でなければならない:
    • ...
    • TCとSCは参照型であり、型SCはbこれらの規則の再帰的適用によってTCにキャストされる。

あなたはList型のオブジェクトを持っているのであれば、[] []、その後、checkcastための規則が再帰的なタイプS = ListとT =コレクションのために呼び出さコレクションにキャストされています。 Listはインタフェースですが、オブジェクトは実行時にList []型を持つことができます。これをJVM Specの保守担当者と確認していないが、私が見る限りでは、これがインターフェイスタイプのルールが存在する唯一の理由です。

+0

ありがとう!それはちょうど私が探していた答えのようなものです。 – templatetypedef

+0

+1ブリリアント。 :) – biziclop

-2

Sは、次に、インタフェースタイプの場合:

Tがクラス型である場合、Tは、オブジェクト(§2.4.7)でなければなりません。
Tがインターフェイスタイプの場合、TはSと同じインターフェイスまたはSのスーパーインターフェイス(2.13.2)でなければなりません。

これは明らかです。インタフェースを拡張したインタフェースにキャストすることができます。このケースは、DataInputStreamでシリアル化を呼び出すときなどに使用されます。DataInputStreamインターフェイスはSerializableを実装しているため、オブジェクトの実装クラスがわからなくてもオブジェクトをSerializableにキャストできます。それはあなたがこの定義について混乱だけではありませんでしたようだ

+1

あなたはその質問を理解していないと思います。また、[java.io.DataInputStream](https://docs.oracle.com/javase/8/docs/api/java/io/DataInputStream.html)はクラスであり、インタフェースではありません。 –

関連する問題