2009-10-20 27 views
6

我手动将Java(1.6)中的代码转换为C#,并发现原始类型(int和double)的行为有些困难。在C#中出现,几乎所有的转换是自动发生自动装箱和取消装箱在Java和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 

我会为的差异进行系统的分析和任何理论基础感谢。

回答

6

在你的C#示例中没有发生装箱或拆箱(和自动装箱)。 double只是structDouble的别名。

在Java中,拳击是必要的。由于type erasure,你不能创建一个List<double>,只有List<Double>。在编译时,List<?>变为List<Object>并且需要进行装箱/取消装箱,因此您可以将本机类型变量添加到List<Object>或将本地变量分配给List的元素。

+0

我之前的印象是列表早在Java中使用Type Erasure之前就存在了,还是我误解了你的意思? – RHSeeger

+1

@RHSeeger,列表是一个泛型类型。 Java中泛型使用Type Erasure实现。所以这意味着列表在Type Erasure(至少使用Type参数)之前不存在。请注意,列表将被转换为原始类型列表。 –

16

在C#中,doubleDouble正是同样的事情(只要你还没有创建自己的类型,称为Double,这将是愚蠢的)。

double定义为作为global::System.Double的别名。因此,这里没有拳击。

在java中,Double是盒装double,类型删除是泛型实现的关键部分。