Domanda

Ho sentito parlare di tipi definiti "in scatola". in alcune lingue.

In Java, ho sentito parlare di " autoboxing " ;. Cos'è questo? Ha classi wrapper per un tipo? Come cambierebbe il mio codice se sto lavorando con tipi boxed o unboxed?

È stato utile?

Soluzione

Alcuni tipi di dati sono considerati "primitivi", nel senso che non sono trattati come un oggetto e non hanno le proprietà di un oggetto.

Sulla maggior parte delle piattaforme, numeri interi e caratteri sono esempi di tipi primitivi ma che possono essere inscatolati.

Boxing significa avvolgerli in un oggetto in modo che abbiano il comportamento di un oggetto.

Il significato e il comportamento esatti dipendono dalla lingua che stai utilizzando. Alcuni linguaggi (come Smalltalk ... almeno waaay quando lo stavo facendo ...) non consentono alcun tipo primitivo e considerano tutto come un oggetto, ma c'è una penalità prestazionale associata a questo perché, alla fine del giorno, il processore deve lavorare con numeri non elaborati e memoria non elaborata per svolgere un lavoro utile. Se vuoi aggiungere due numeri interi che sono stati inscatolati, ad esempio, dietro le quinte sono "unboxed". in tipi primitivi, i numeri vengono aggiunti e quindi vengono riordinati in un nuovo numero intero.

Altri suggerimenti

Informazioni più specifiche per Java:

Il box automatico consente a java di convertire automaticamente cose come booleano e int nelle loro versioni di oggetti Boolean e Integer automaticamente nella maggior parte dei casi. Permette anche il contrario.

Ad esempio:

int a = 3; // no boxing is happening
Integer b = 3;  // newer versions of java automatically convert the int 3 to Integer 3
int c = b;  // these same versions also automatically convert Integer 3 to int 3

Le versioni precedenti di java che non dispongono di box automatico richiedono questo codice per fare la stessa cosa:

int a = 3;  // works the same
Integer b = new Integer(3);  //must set up a Integer object manually
int c = b.intValue(); //must change Integer object to a primitive

Tuttavia, ci sono alcuni scenari in cui devi ancora fare le cose manualmente. Ad esempio, immagina di avere una classe con due metodi simili:

assertEquals(int a, int b);
assertEquals(Object a, Object b)

Ora, se provi a farlo:

Integer a = 3;
int b = 3;
assertEquals(a, b);  // this will not compile

Il motivo per cui non funziona è perché non riesce a capire se dovrebbe decomprimere a in un int o box b in un intero . Pertanto è ambiguo quale firma del metodo debba essere chiamata. Per risolvere questo problema puoi eseguire una di queste operazioni:

assertEquals((int) a, b);
assertEquals(a, (Integer) b);

Sì, boxe significa prendere un tipo di valore e racchiuderlo in un tipo di riferimento. Da quando Java ha introdotto l'autoboxing puoi fare:

void foo(Object bar) {}
//...
    foo(1);

E java trasformerà automaticamente int 1 in un intero. Nelle versioni precedenti avresti dovuto fare:

foo(new Integer(1));

L'autoboxing è molto utile in java quando si lavora con i generici, dal momento che non è possibile utilizzare le primitive con i generici, quindi per archiviare ints in un elenco, dovresti creare un List < Integer > e inserisci gli integri nell'elenco in scatola.

Un tipo boxed significa che i valori sono allocati in un blocco sull'heap e referenziati attraverso un puntatore. Questo è utile per l'uniformità nell'implementazione del runtime (rende più semplice avere funzioni generiche, ecc.), Al costo di un'ulteriore indiretta.

Generalmente quando lavori con le raccolte, hai a che fare con matrici di Oggetti. In lingue come Java, c'è una differenza tra una primitiva e un oggetto. Quando una primitiva è "inscatolata", è essenzialmente solo un involucro attorno a una primitiva, quindi gioca bene con il resto del framework che si aspetta un oggetto.

L'autoboxing è solo l'atto di mettere una primitiva in un oggetto o di estrarre una primitiva da un oggetto in modo trasparente in modo da non doversi preoccupare del passaggio aggiuntivo da fare da soli.

Boxed significa che hanno preso un tipo di valore regolare e creato un oggetto attorno ad esso. Un po 'come metterlo in una scatola. Questo è generalmente da evitare, a causa del sovraccarico di costruzione dell'oggetto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top