In che modo tipizzare un array è diverso dal typecasting di un singolo elemento?

-2

è il seguente frammento di codice:

           String[] str = {"Abc","Ghi","Def","Mno"};
           Object[] obj = str;
           String[] p = (String[]) obj;

come:

          String[] str = {"Abc","Ghi","Def","Mno"};
          Object[] obj = str;
          String str1 = (String) obj[0];
          String str2 = (String) obj[1];
          String str3 = (String) obj[2];
          String str4 = (String) obj[3];

In che modo tipizzare un array come nel primo codice è diverso dagli elementi singoli di typecast? È lo stesso?

    
posta user1369975 22.10.2016 - 05:57
fonte

2 risposte

3

Per cominciare, nel primo caso si finisce con una variabile di tipo String[] , ma nel secondo caso si finisce con quattro variabili di tipo String .
Qual è la differenza tra un array e un gruppo di variabili? :)

Supponendo che tu sia più interessato alla differenza tra il codice equivalente che produce un array:

Object[] obj = str;
String[] p = (String[]) obj;

e

Object[] obj = str;
String[] p = new String[] {
    (String)obj[0],
    (String)obj[1],
    (String)obj[2],
    (String)obj[3]};

le principali differenze sono:

  • Il secondo snippet di codice crea una nuova matrice. Se dovessi fare str[2] = "blah"; dopo aver eseguito il primo snippet, quindi p[2] conterrà anche "blah", perché p e str sono riferimenti allo stesso array. Con il secondo snippet, p[2] conterrebbe ancora "Ghi" .
  • Il secondo snippet di codice funziona indipendentemente dal tipo di str . Se str è stato effettivamente creato come:

    Object[] str = {"Abc","Ghi","Def","Mno"};
    

    quindi il primo snippet genererebbe un ClassCastException perché l'oggetto obj si riferisce a non a String[] . Il secondo frammento funzionerebbe correttamente purché tutti gli elementi fossero String s.

  • Il secondo snippet genera ArrayIndexOutOfBoundsException se l'array ha meno di quattro elementi e copia solo i primi quattro elementi se ne ha più di quattro. Tuttavia, potresti facilmente scrivere una versione che potrebbe funzionare per un numero arbitrario di elementi.
risposta data 22.10.2016 - 12:06
fonte
0

La differenza è dove vengono controllati i tipi:

       String[] p = (String[]) obj;

Qui controlliamo se obj è veramente un String[] . Dopo averlo controllato, sappiamo che ogni elemento di obj è una stringa.

      String str1 = (String) obj[0];
      String str2 = (String) obj[1];
      String str3 = (String) obj[2];
      String str4 = (String) obj[3];

Qui, controlliamo ogni elemento individualmente. Non verifichiamo mai se obj sia realmente una stringa [], e in effetti questo codice funzionerà se non lo è. Invece, controlliamo ciascun elemento individualmente per vedere se si tratta di una stringa.

    
risposta data 22.10.2016 - 21:16
fonte

Leggi altre domande sui tag