2013-02-20 2 views
1

J'ai toujours pensé CharSequence [] et String [] étaient indispensables même, cependant:Conversion CharSequence [] et CharSequence []

J'ai un code qui a les éléments suivants:

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

Lorsque la le code fonctionne Je reçois

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

Alors deux questions?

  • pourquoi peut cette fonte ne se produira pas
  • pourquoi le ArrayAdapter pas permis une CharSequence [] dans son constructeur.
+0

rien empêcher une arrayadapter d'utiliser un CharSequence [] en tant que paramètre. – njzk2

+0

Lorsque j'essaie je reçois ce qui suit: Le constructeur ArrayAdapter (Context, int, CharSequence []) est indéfini –

+2

pourquoi n'utilisez-vous pas 'ArrayAdapter '? – jlordo

Répondre

5

CharSequence est l'interface qui String, StringBuffer, StringBuilder les classes outils. Donc CharSequence peut contenir toute cette classe d'implémentation de l'objet et CharSequence#toString retours String, essayez -

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

pourquoi battu ??? –

+1

(pas par moi donc je ne peux que deviner, mais je dirais que c'est parce que c'est inutile et exagéré?) – njzk2

1

CharSequence est une interface. La classe String implémente cette interface. Donc, vous ne pouvez pas le jeter aux String, de la même manière que vous ne pouvez pas lancer List à ArrayList, car il ne doit pas être une instance de cette classe concrète

+1

Vous pouvez lancer 'List' à' ArrayList', le 'ClassCastException' ** arrivera seulement ** si le référencé objet n'est pas de type 'ArrayList'. Voir: 'List list = new ArrayList(); ArrayList a = (ArrayList) liste; LinkedList b = (LinkedList) list; 'La première distribution fonctionnera, la seconde échouera. – jlordo

+0

@jlordo oui, je suis d'accord. J'aurais dû écrire que vous ne pouvez pas le lancer en toute sécurité, sauf si vous utilisez l'opérateur instanceof –

1

Vous ne pouvez pas jeter référence CharSequence[] dans String[].

Vous pouvez jeter seulement dans cette situation:

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

moyen sûr de résoudre votre problème:

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; 
} 
Questions connexes