我手动从Java(1.6)变换代码,以C#和发现一些困难的图元的行为(int和双)。在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#中,doubleDouble究竟同样的事情(只要你还没有创建自己的类型,称为Double,这将是愚蠢的)。

double定义作为别名到global::System.Double。因此,不存在拳击这里。

在Java中,Double是盒装double,与类型擦除作为泛型实现的关键部分。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top