在谈论泛型时,技术上很难包含基元类型吗?
在Java的情况下,这是因为泛型的工作方式。在Java中,泛型是一种编译时技巧,可以防止您将对象放入.但是,Java 的泛型是通过类型擦除实现的:泛型类型信息在运行时丢失。这是出于兼容性原因,因为泛型是在Java的生命周期中相当晚才添加的。这意味着,在运行时,an 实际上是一个(或更好:在其所有方法中期望并返回的),它会在检索值时自动强制转换为。Image
ArrayList<String>
ArrayList<String>
ArrayList<Object>
ArrayList
Object
String
但是由于 它不是从 派生的,你不能把它放在一个期望的 ArrayList 中(在运行时),你也不能把 一个 强制转换为。这意味着必须将基元包装到继承自 的类型中,如 。int
Object
Object
Object
int
int
Object
Integer
例如,C# 的工作方式不同。C# 中的泛型在运行时也是强制实施的,并且不需要使用 .仅当您尝试存储值类型(如 引用类型变量(如 )时,才会在 C# 中装箱。由于在 C# 中继承自 C#,因此写入是完全有效的,但是 int 将被装箱,这是由编译器自动完成的(没有引用类型向用户或任何东西公开)。List<int>
int
object
int
Object
object obj = 2
Integer