2009-10-20 10 views
6

Je convertis manuellement le code de Java (1.6) en C# et je trouve une certaine difficulté avec le comportement des primitives (int et double). En C#, il semble que presque toutes les conversions se produisent automatiquementL'autoboxing et le déballage se comportent différemment en Java et en 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# 

mais en Java seulement quelques-uns sont autorisés

 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 

Je serais reconnaissant d'une analyse systématique des différences et toute raison d'être.

Répondre

6

Dans votre exemple C#, il n'y a pas de boxe ou de déballage (et autoboxing). double est juste un alias pour le structDouble.

En Java, la boxe est nécessaire. En raison de type erasure, vous ne pouvez pas créer un List<double>, seulement List<Double>. Au moment de la compilation, List<?> devient List<Object> et boxing/unboxing devra avoir lieu afin que vous puissiez ajouter une variable de type natif à un List<Object> ou affecter une variable native à un élément de la liste.

+0

J'avais l'impression que la liste existait bien avant l'effacement de Java, ou est-ce que je ne comprends pas ce que vous dites? – RHSeeger

+1

@RHSeeger, Liste est un type générique. Génériques en Java où/sont implémentés avec Type Erasure. Cela implique donc que la liste n'existait pas avant l'effacement de type (au moins avec les paramètres Type). Notez que, Liste sera traduit à la liste de type brut. –

16

En C#, double et Double sont exactement la même chose (aussi longtemps que vous ne l'avez pas créé votre propre type appelé Double, ce qui serait stupide).

double est défini comme alias à global::System.Double. En tant que tel, il n'y a pas de boxe ici.

En Java, Double est une boîte double, avec l'effacement de type étant un élément clé de la mise en œuvre des génériques.

Questions connexes