为什么 Java 泛型不支持基元类型?
为什么Java中的泛型与类一起使用,而不适用于基元类型?
例如,这工作正常:
List<Integer> foo = new ArrayList<Integer>();
但这是不允许的:
List<int> bar = new ArrayList<int>();
为什么Java中的泛型与类一起使用,而不适用于基元类型?
例如,这工作正常:
List<Integer> foo = new ArrayList<Integer>();
但这是不允许的:
List<int> bar = new ArrayList<int>();
Java中的泛型是完全编译时的构造 - 编译器将所有泛型用途转换为正确的类型。这是为了保持与以前的 JVM 运行时的向后兼容性。
这:
List<ClassA> list = new ArrayList<ClassA>();
list.add(new ClassA());
ClassA a = list.get(0);
变成(大致):
List list = new ArrayList();
list.add(new ClassA());
ClassA a = (ClassA)list.get(0);
因此,任何用作泛型的东西都必须可转换为 Object(在此示例中返回一个),而基元类型则不是。因此,它们不能用于泛型。get(0)
Object
在Java中,泛型的工作方式与它们的工作方式相同...至少部分...因为它们是在语言设计1之后的几年内添加到语言中的。语言设计人员在泛型的选择上受到限制,因为他们必须提出一个与现有语言和Java类库向后兼容的设计。
其他编程语言(例如C++,C#,Ada)确实允许将基元类型用作泛型的参数类型。但这样做的另一面是,这些语言的泛型(或模板类型)的实现通常需要为每个类型参数化生成泛型类型的不同副本。
1 - Java 1.0 中未包含泛型的原因是时间压力。他们觉得他们必须迅速发布Java语言,以填补Web浏览器带来的新市场机会。詹姆斯·高斯林(James Gosling)曾表示,如果他们有时间,他本来希望包括泛型。如果发生这种情况,Java语言会是什么样子是任何人的猜测。