Faites autoboxing et se comportent différemment unboxing en Java et C #
-
22-09-2019 - |
Question
Je suis le code de Java manuellement la conversion (1,6) à C # et de trouver des difficultés avec le comportement des primitives (int et double). En C #, il semble que presque toutes les conversions se produisent automatiquement
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 pour une analyse systématique des différences et toute justification sous-jacente.
La solution
Dans votre exemple C # il n'y a pas de boxe ou unboxing (et autoboxing) qui se passe. double
est juste un alias pour le struct
de Double
.
En Java, la boxe est nécessaire. En raison de , vous ne pouvez pas créer un List<double>
, seulement List<Double>
. Au moment de la compilation, List<?>
devient List<Object>
et la boxe / 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.
Autres conseils
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 un alias à global::System.Double
. En tant que tel, il n'y a pas de boxe ici.
En java, Double
est un double
en boîte, avec le type d'effacement étant un élément clé de la mise en œuvre des génériques.