異なっJavaとC#でオートボクシングとアンボクシング振る舞いを実行します。
-
22-09-2019 - |
質問
私は手動でC#へのJava(1.6)からコードを変換し、プリミティブの行動(int型とdouble)といくつかの困難を見つけています。 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で一部だけが許可されている。
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#の例では何のボクシングまたはアンボクシング(およびオートボクシング)起こってはありません。 double
はstruct
のDouble
のためだけのエイリアスです。
はJavaでは、ボクシングが必要です。そのため型消去に、あなたが作成することはできません。 List<double>
、唯一List<Double>
。コンパイル時には、List<?>
はあなたがList<Object>
にネイティブ型変数を追加したり、リストの要素に固有の変数を割り当てることができますので、場所を取る必要がありますアンボクシング/ List<Object>
とボクシングになります。
他のヒント
でC#、double
とDouble
あるの正確の同じ事(あなたは愚かなことでしょうDouble
、と呼ばれる独自のタイプを作成していない限りとして)。
double
は global::System.Double
にエイリアスとしての定義です。そのため、ここにはボクシングがありません。
Javaでは、Double
タイプ消去がジェネリックの実装の重要な部分であると、箱入りdouble
である。
所属していません StackOverflow