web-dev-qa-db-fra.com

Qu'est-ce que cela signifie de dire un type est "Boxed"?

J'ai entendu parler de types d'étant appelés "encadré" dans certaines langues.

À Java, j'ai entendu parler de "autoboxing". Qu'est-ce que c'est? Est-ce qu'il faut des cours d'enveloppe pour un type? Comment mon code changerait-il si je travaille avec des types en boîte ou non?

45
Nick Heiner

Certains types de données sont considérés comme "primitifs", ce qui signifie qu'ils ne sont pas traités comme un objet et ne disposent pas des propriétés d'un objet.

Sur la plupart des plates-formes, des entiers et des caractères sont des exemples de types primitifs mais peuvent être en boîte.

La boxe signifie les envelopper dans un objet afin d'avoir le comportement d'un objet.

Le sens exact et le comportement dépend de la langue que vous utilisez. Certaines langues (telles que SmallTalk ... au moins waaay dos quand je le faisais ...) Ne laissez aucun type primitif et considérez que tout soit un objet, mais il y a une pénalité de performance associée à cela parce que, à la fin de la journée, le processeur doit fonctionner avec des chiffres bruts et une mémoire brute pour faire du travail utile. Si vous souhaitez ajouter deux entiers qui ont été en boîte, par exemple, dans les coulisses, ils sont "non-construits" dans des types primitifs, les numéros sont ajoutés et ils sont ensuite en boîte dans un nouvel entiers.

62
Eric J.

Informations plus spécifiques pour Java:

AutoBoxing permet =Java== Convertir automatiquement des choses comme boolean et int à leurs versions d'objet Boolean et Integer dans la plupart cas. Il permet également au revers de se produire.

Par exemple:

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

Les versions plus anciennes de Java qui n'ont pas d'autoboxage nécessiteront ce code pour faire la même chose:

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

Cependant, il y a des scénarios où vous devez toujours faire les choses manuellement. Par exemple, imaginez que vous avez une classe avec deux méthodes comme si:

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

Maintenant, si vous essayez de faire cela:

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

La raison pour laquelle cela ne fonctionne pas est que cela ne peut pas déterminer si la boîte de commande _ a à un int ou boîte b à un Integer. Par conséquent, il est ambigu que la signature de méthode doit être appelée. Pour résoudre ce problème, vous pouvez faire l'un d'entre eux:

assertEquals((int) a, b);
assertEquals(a, (Integer) b);
19
TM.

Oui, la boxe signifie prendre une valeur de valeur et l'envelopper dans un type de référence. Depuis Java a introduit l'autoboxing que vous pouvez faire:

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

Et Java tournera automatiquement le INT 1 en un entier. Dans les versions précédentes, vous devrez faire:

foo(new Integer(1));

L'autoboxage est le plus utile dans Java Lorsque vous travaillez avec des génériques, car vous ne pouvez pas utiliser des primitives avec des génériques, afin de stocker des INT dans une liste, vous devez faire une List<Integer> et mettre les INT dans la liste en boîte.

12
sepp2k

Boxed signifie qu'ils ont pris un type de valeur régulier et ont créé un objet autour de lui. Une sorte de comme la mettre dans une boîte. Cela doit généralement être évité, en raison de la surcharge de la construction de l'objet.

1
Alex Baranosky