题
我手动从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#中,double
和Double
是究竟同样的事情(只要你还没有创建自己的类型,称为Double
,这将是愚蠢的)。
double
是定义作为别名到global::System.Double
。因此,不存在拳击这里。
在Java中,Double
是盒装double
,与类型擦除作为泛型实现的关键部分。
不隶属于 StackOverflow