1

StringBuilder と CharBuffer は両方とも、CharSequence および Appendable インターフェースを実装します。スーパーインターフェースを宣言するとき

 public  interface IAppendableCharSequence extends CharSequence, Appendable{}

次に、CharBuffer を IAppendableCharSequence にキャストできますが、StringBuilder にはキャストできません。

 private IAppendableCharSequence m_buffer;

 // ...

 m_buffer = (IAppendableCharSequence) CharBuffer.allocate(512); // ok


 m_buffer = (IAppendableCharSequence) new StringBuilder(512); // Cannot cast from StringBuilder to IAppendableCharSequence

何故ですか?ありがとう!

4

3 に答える 3

4

どちらも実際には実行時に機能しませんが、コンパイラが一方を許可し、他方を許可しない理由は、それが有効であり、そうStringBuilderfinalないCharBufferためです。

コンパイラは、それ自体がそのインターフェイスを実装しておらず、サブクラスを持つことができないためinstanceof StringBuilder、有効な実装になることはできないことを確実に認識しています。そのため、そのキャストが合法になる状況はなく、コンパイラはそれを拒否します。IAppendableCharSequenceStringBuilderfinal

コンパイラの場合、実装するカスタムサブクラスを作成する可能性CharBufferがあるため、コンパイラにはその保証がありませCharBufferIAppendableCharSequence

どのキャストがコンパイラーによって許可され、どのキャストが許可されないかについての規則は、Java 言語仕様 (この場合はセクション 5.1.6 (ナローイング参照変換)) にあり、とりわけ変換が許可されています。

実装されていない、または実装されていない場合、任意のクラス型からパラメータ化されていないCインターフェイス型へKCfinalK

つまり、クラスが final でない場合、クラスによって実装されていない任意のクラス型から任意のインターフェイス型へのキャストは有効です。

于 2014-07-02T10:43:54.753 に答える