2009-10-20 10 views
6

Estoy convirtiendo manualmente el código de Java (1.6) a C# y encontrando alguna dificultad con el comportamiento de las primitivas (int y doble). En C# parece que casi todas las conversiones se producen automáticamenteHacer autoboxing y unboxing se comportan de manera diferente en Java y C#

 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 se les permite

 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 

Estaría agradecido por un análisis sistemático de las diferencias y cualquier lógica subyacente.

Respuesta

6

En su ejemplo de C# no hay boxeo ni unboxing (y autoboxing). double es solo un alias para structDouble.

En Java, el boxeo es necesario. Debido a type erasure, no puede crear un List<double>, solo List<Double>. En tiempo de compilación, List<?> pasa a ser List<Object> y deberá realizarse el boxeo/desempaquetado para que pueda agregar una variable de tipo nativo a List<Object> o asignar una variable nativa a un elemento de la lista.

+0

Tenía la impresión de que List existía desde mucho antes de Type Erasure en Java, o estoy entendiendo mal lo que está diciendo? – RHSeeger

+1

@RHSeeger, List es un tipo genérico. Genéricos en Java donde/se implementan con Type Erasure. Por lo tanto, esto implica que la Lista no existía antes del Borrado de tipos (al menos con los parámetros de Tipo). Tenga en cuenta que la lista se traducirá a la lista de tipo sin formato. –

16

En C#, y doubleDouble son exactamente lo mismo (siempre y cuando usted no ha creado su propio tipo llamado Double, lo que sería estúpido).

double es se ha definido como un alias de global::System.Double. Como tal, no hay boxeo aquí.

En java, Double es un double en caja, con el borrado de tipo siendo una parte clave de la implementación de genéricos.

Cuestiones relacionadas