2009-10-20 26 views
6

コードをJava(1.6)からC#に手動で変換し、プリミティブ(intとdouble)の動作に問題があります。唯一のいくつかはJavaとC#でオートボクシングとアンボクシングの動作が異なっています

 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 

許可されている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# 

が、Javaで自動的に行われることが表示されます私は違い、あらゆる根本的な根拠の体系的な分析のために感謝するだろう。 C#ので

答えて

6

あなたのC#の例では、ボクシングやアンボクシング(そしてオートボクシング)は起こりません。 doubleは、structDoubleの単なるエイリアスです。

Javaでは、ボクシングが必要です。 type erasureのため、は作成できません。List<Double>のみ作成できます。コンパイル時にList<?>List<Object>になり、ネイティブタイプの変数をList<Object>に追加するか、リストの要素にネイティブ変数を割り当てることができるように、ボクシング/アンボクシングを実行する必要があります。

+0

私は、リストがJavaでタイプ消去の前に存在していたという印象を受けましたか、あなたが言っていることを誤解していますか? – RHSeeger

+1

@RHSeeger、リストは一般的なタイプです。 /がJavaのジェネリックで、タイプ消去で実装されています。これは、List がType Erasureの前に存在しなかったことを意味します(少なくともTypeパラメータでは)。リストは生のタイプのリストに変換されます。 –

16

doubleDouble正確同じもの(限り、あなたは愚かなことでしょうDoubleと呼ばれる独自のタイプを作成していないよう)です。

doubleは、global::System.Doubleの別名としてと定義されている。である。したがって、ここにボクシングはありません。

javaでは、Doubleは、ボックス消去doubleであり、タイプ消去はジェネリック実装の重要な部分です。

関連する問題