1

次のコードで適切な ClassCastException が生成される理由:

public static void main(String []args){
        StringBuilder s1 = new StringBuilder("quaqua");
        StringBuilder s12= (StringBuilder)s1.subSequence(0,3);
        System.out.println(s12);
     }

一方、次のコード ( StringBuilder を String に置き換えます):

public static void main(String []args){
        String s1 = new String("quaqua");
        String s12= (String)s1.subSequence(0,3);
        System.out.println(s12);
     }

正常に動作します?;

メソッドがあることは理解していますが、substring(int begin, int end);StringBuilder (CharSequence を実装する) を使用したキャストが機能しないのに、String を使用したキャストが機能しない理由に興味があります。

前もって感謝します。

4

4 に答える 4

7

これは、StringBuilder.subSequence が返す実際のクラスが String であるためです。

...
public CharSequence subSequence(int start, int end) {
    return substring(start, end);
}

public String substring(int start, int end) {
    ...
    return new String(value, start, end - start);
}

String を StringBuilder にキャストすることはできません。

于 2013-07-08T08:28:56.567 に答える
1

の API ドキュメントStringBuilder.subSequence:

フォームのこのメソッドの呼び出し

sb.subSequence(begin, end)

呼び出しとまったく同じように動作します

sb.substring(begin, end)

Stringですが、CharSequenceではありませStringStringBuilder。だからキャストは失敗した。

代わりにこれを行うことができます:

StringBuilder s12= new StringBuilder(s1);
s12.setLength(3);
于 2013-07-08T08:29:07.903 に答える
1

メソッドは実行時にオブジェクトではなくオブジェクトをsubSequence()返すためです。StringBuilder#subSequence()のドキュメントに従ってStringStringBuilder

このシーケンスのサブシーケンスである新しい文字シーケンスを返します。フォームのこのメソッドの呼び出し

sb.subSequence(begin, end) は、呼び出しとまったく同じように動作します

sb.substring(開始、終了)

ここでコードを実行すると:

public CharSequence subSequence(int beginIndex, int endIndex) {
    return this.substring(beginIndex, endIndex);
}

そして、次のコードが表示された場合substring():

public String substring(int beginIndex, int endIndex) {
    if (beginIndex < 0) {
        throw new StringIndexOutOfBoundsException(beginIndex);
    }
    if (endIndex > value.length) {
        throw new StringIndexOutOfBoundsException(endIndex);
    }
    int subLen = endIndex - beginIndex;
    if (subLen < 0) {
        throw new StringIndexOutOfBoundsException(subLen);
    }
    return ((beginIndex == 0) && (endIndex == value.length)) ? this
            : new String(value, beginIndex, subLen);
}

を返します。これは、の戻り値の型が のインターフェイスを実装しているStringためですが、内部的には で動作します。にキャストすることはできませんStringCharSequencesubSequence()CharSequenceStringStringStringBuilder

于 2013-07-08T08:30:56.817 に答える