2013-02-20 92 views
1

我一直以爲的CharSequence []和的String []是必不可少的一樣,但是:轉換爲CharSequence []和的CharSequence []

我有了下面的一些代碼:

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[] 

所以有兩個問題?

  • 爲什麼這個轉換不會發生
  • 爲什麼一個ArrayAdapter不允許一個的CharSequence []在它的構造。
+0

沒有阻止arrayadapter使用的CharSequence []作爲參數。 – njzk2 2013-02-20 15:33:59

+0

當我嘗試我得到以下內容:構造函數ArrayAdapter (Context,int,CharSequence [])未定義 – 2013-02-20 15:36:10

+2

爲什麼不使用'ArrayAdapter '?作爲@jlordo指出的 – jlordo 2013-02-20 15:39:23

回答

5

CharSequence是接口,其StringStringBufferStringBuilder類工具。所以CharSequence可以持有任何本實現類的對象而CharSequence#toString回報String,試着 -

String[] mEntriesString = new String[mEntries.length]; 
int i=0; 
for(CharSequence ch: mEntries){ 
    mEntriesString[i++] = ch.toString(); 
} 
+0

爲什麼downvoted ??? – 2013-02-20 15:49:10

+1

(不是我所以我只能猜測,但我會說這是因爲它是無用的和矯枉過正?) – njzk2 2013-02-20 16:29:10

1

CharSequence是一個接口。 String類實現了該接口。所以,你不能將它轉換爲String,你可以不投ListArrayList以同樣的方式,因爲它不必是具體的類

+1

您可以將'List'強制轉換爲'ArrayList','ClassCastException'只會**如果被引用對象不是'ArrayList'類型。參見:'List list = new ArrayList(); ArrayList a =(ArrayList)列表; LinkedList b =(LinkedList)列表;「第一次投射會奏效,第二次會失敗。 – jlordo 2013-02-20 15:34:30

+0

@jlordo是的,我同意。我應該寫道,除非你使用instanceof操作符,否則你不能安全地使用它 – 2013-02-20 15:46:10

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; 
} 
相關問題