Tun autoboxing und unboxing Verhalten sich anders in Java und C#
-
22-09-2019 - |
Frage
Ich bin manuell konvertieren von code aus Java (1.6) - C# und die Suche nach einigen Schwierigkeiten mit dem Verhalten der primitiven (int und double).In C# scheint es, dass fast alle Konvertierungen automatisch passieren
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#
aber in Java nur einige sind erlaubt
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
Ich wäre dankbar für eine systematische Analyse der Unterschiede und die zugrunde liegende Logik.
Lösung
In Ihrem C# - Beispiel gibt es keine Boxen oder unboxing (und autoboxing) passiert. double
ist nur ein alias für die struct
Double
.
In Java, das Boxen notwendig ist.Wegen type-erasure, Sie können nicht erstellen eine List<double>
, nur List<Double>
.Zur compile-Zeit, List<?>
wird List<Object>
und Boxen/unboxing stattfinden müssen, so können Sie fügen Sie eine native Typ-variable ein List<Object>
oder ordnen Sie einer einheitlichen variable auf ein element der Liste.
Andere Tipps
In C#, double
und Double
sind genau das gleiche (solange du keine eigene erstellt haben, geben Sie genannt Double
,, das wäre dumm).
double
ist definiert als alias global::System.Double
.Als solche, es gibt keine Boxen hier.
In java, Double
ist ein boxed double
, mit type-erasure wird ein wesentlicher Teil der Generika-Implementierung.