異なっJavaとC#でオートボクシングとアンボクシング振る舞いを実行します。

StackOverflow https://stackoverflow.com/questions/1597154

  •  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#の例では何のボクシングまたはアンボクシング(およびオートボクシング)起こってはありません。 doublestructDoubleのためだけのエイリアスです。

はJavaでは、ボクシングが必要です。そのため型消去に、あなたが作成することはできません。 List<double>、唯一List<Double>。コンパイル時には、List<?>はあなたがList<Object>にネイティブ型変数を追加したり、リストの要素に固有の変数を割り当てることができますので、場所を取る必要がありますアンボクシング/ List<Object>とボクシングになります。

他のヒント

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

double global::System.Doubleにエイリアスとしての定義です。そのため、ここにはボクシングがありません。

Javaでは、Doubleタイプ消去がジェネリックの実装の重要な部分であると、箱入りdoubleである。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top