2009-10-20 8 views
6

Ręcznie zamieniam kod z Javy (1.6) na C# i znajduję pewne trudności z zachowaniem się prymitywów (int i double). W języku C# wydaje się, że prawie wszystkie konwersje zdarzyć automatycznieCzy autoboxing i unboxing zachowują się inaczej w Javie i 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# 

ale w Javie tylko niektóre mogą

 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 

Byłbym wdzięczny za systematyczną analizę różnic i wszelkich podstawowych przesłankach.

Odpowiedz

6

W twoim przykładzie C# nie ma boksu ani rozpakowywania (i autoboxingu). double to tylko alias dla structDouble.

W języku Java boks jest niezbędny. Z powodu type erasure nie można utworzyć List<double>, tylko List<Double>. W czasie kompilacji List<?> staje się List<Object> i konieczne będzie przeprowadzenie boksu/rozpakowywania, aby można było dodać zmienną typu natywnego do List<Object> lub przypisać zmienną natywną do elementu listy.

+0

Miałem wrażenie, że lista istniała na długo przed wpisaniem Erasure w Javie, czy też nie rozumiem, o czym mówisz? – RHSeeger

+1

@RHSeeger, lista to rodzajowy typ. Generics w Javie, gdzie/są realizowane z Type Erasure. Oznacza to, że List nie istniał przed usunięciem typu (przynajmniej z parametrami typu). Zauważ, że lista zostanie przetłumaczona na listę typu surowego. –

16

W języku C#, double i Doubledokładnie samo (o ile nie utworzono własny typ zwany Double, co byłoby głupie).

double jest zdefiniowane jako aliasu global::System.Double. W związku z tym nie ma tu boksu.

w Javie, Double jest box double, z typu wymazywania jest kluczowym elementem realizacji generycznych.

Powiązane problemy