Hacer autoboxing y se comportan de manera diferente unboxing en Java y C #
-
22-09-2019 - |
Pregunta
Estoy convirtiendo manualmente el código de Java (1.6) a C # y encontrar alguna dificultad con el comportamiento de los primitivos (int y doble). En C # parece que casi todas las conversiones se producen automáticamente
List<double> list1 = new List<double>(); // legal, C#
double d0 = 3.0;
list1.Add(d0); // legal, C#
Double dd = 2.3f; // legal, C#
list1.Add(dd); // legal, C#
List<Double> list2 = new List<Double>(); // legal, C#
double d1 = 3.0;
list2.Add(d1); // legal, C#
list2.Add(2.0); // legal, C#
double d2 = list2.get(0); // legal, C#
pero en Java sólo algunos están permitidos
List<double> list1 = new ArrayList<double>(); // illegal, Java
List<Double> list2 = new ArrayList<Double>(); // legal, Java
double d1 = 3.0;
list2.add(d1); // legal, Java
list2.add(2.0); // legal, Java
double d2 = list2.get(0); // legal, Java
Yo estaría agradecido por un análisis sistemático de las diferencias y cualquier lógica subyacente.
Solución
En el ejemplo de C # no hay boxeo o unboxing (y autoboxing) pasando. double
es sólo un alias para el struct
Double
.
En Java, el boxeo es necesario. Debido a tipo borrado , no se puede crear una List<double>
, solamente List<Double>
. En tiempo de compilación, se convierte en List<?>
List<Object>
y el boxeo necesidad / unboxing voluntad a tener lugar para que pueda agregar una variable de tipo nativo a un List<Object>
o asignar una variable nativa de un elemento de la lista.
Otros consejos
En C #, y double
Double
son exactamente lo mismo (siempre y cuando usted no ha creado su propio tipo llamado Double
, lo que sería estúpido).
double
es definido como un alias para global::System.Double
. Como tal, no hay boxeo aquí.
En Java, Double
es un double
en caja, con el tipo de borrado de ser una parte clave de la aplicación genéricos.