1

私はいつもCharSequence[]とString[]は本質的に同じだと思っていましたが、:

私は次のようなコードを持っています:

CharSequence[] mEntries;
...
String[] mEntriesString = (String[]) mEntries;
ListAdapter adapter = new ArrayAdapter<String>(getContext(), R.layout.two_lines_list_preference_row, mEntriesString)

コードを実行すると、

java.lang.ClassCastException: java.lang.CharSequence[] cannot be cast to java.lang.String[]

では、2つの質問ですか?

  • なぜこのキャストは起こらないのですか
  • ArrayAdapterがコンストラクターでCharSequence[]を許可しないのはなぜですか。
4

3 に答える 3

6

CharSequenceString、、クラスが実装するStringBufferインターフェースです。StringBuilderしたがってCharSequence、この実装クラスのObjectのいずれかを保持でき、戻り値をCharSequence#toString返しますString

String[] mEntriesString = new String[mEntries.length];
int i=0;
for(CharSequence ch: mEntries){
    mEntriesString[i++] = ch.toString(); 
}
于 2013-02-20T15:29:23.460 に答える
1

CharSequenceインターフェースです。Stringクラスはそのインターフェースを実装します。したがって、にキャストすることはできません。これは、にキャストできStringないのと同じ方法です。これは、その具象クラスのインスタンスである必要がないためです。ListArrayList

于 2013-02-20T15:29:39.577 に答える
1

CharSequence[]に参照をキャストすることはできませんString[]

あなたはその状況でのみそれをキャストすることができます:

        CharSequence[] charSequencesAsString = new String[] { "test" };
        String[] result = (String[]) charSequencesAsString;
        System.out.println(Arrays.toString(result));

問題を解決する安全な方法:

public static void main(String[] args) {

    CharSequence[] charSequencesAsString = new String[] { "test" };
    CharSequence[] charSequencesAsCharSequence = new CharSequence[] { "test" };
    CharSequence[] charSequencesAsStringBuilder = new StringBuilder[] { new StringBuilder("Test") };

    String[] stringsFromStrings = convertToStringArray(charSequencesAsString);
    String[] stringsFromCharSequence = convertToStringArray(charSequencesAsCharSequence);
    String[] stringsFromStringBuilder = convertToStringArray(charSequencesAsStringBuilder);

    System.out.println("Same array after conversion: " + (stringsFromStrings == charSequencesAsString));
    System.out.println("Same array after conversion: " + (stringsFromCharSequence == charSequencesAsCharSequence));
    System.out.println("Same array after conversion: " + (stringsFromStringBuilder == charSequencesAsStringBuilder));
}

public static String[] convertToStringArray(CharSequence[] charSequences) {
    if (charSequences instanceof String[]) {
        return (String[]) charSequences;
    }

    String[] strings = new String[charSequences.length];
    for (int index = 0; index < charSequences.length; index++) {
        strings[index] = charSequences[index].toString();
    }

    return strings;
}
于 2013-02-20T15:33:16.253 に答える