9

コードをJava(1.6)からC#に手動で変換していますが、プリミティブ(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

違いと根本的な論理的根拠の体系的な分析に感謝します。

4

2 に答える 2

20

C#ではdoubleまったくDouble同じです(と呼ばれる独自の型を作成していない限り、これはばかげています)。Double

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

Javaでは、Doubleはボックス化doubleされており、型消去はジェネリックス実装の重要な部分です。

于 2009-10-20T20:42:01.713 に答える
10

C#の例では、ボックス化またはボックス化解除(および自動ボックス化)は発生していません。double の単なるエイリアスですstruct Double

Javaでは、ボクシングが必要です。型消去のため、を作成することはできません。List<double>のみを作成できますList<Double>。コンパイル時に、List<?>becomesList<Object>とboxing / unboxingを実行する必要があります。これにより、ネイティブ型変数をに追加しList<Object>たり、ネイティブ変数をリストの要素に割り当てたりできます。

于 2009-10-20T20:50:42.033 に答える