Java noob:仅针对对象的泛型?

Sev*_*yev 8 java generics

我是Java的新手.在编写Map <>时,我发现声明Map<int, int>是语法错误,而且没问题Map<Integer, Integer>.是否只能在Java中实例化对象类型的泛型,而不是原语?如果是这样,基元的装箱/拆箱会有明显的性能损失吗?

pol*_*nts 11

是的,你只能使用参考类型作为泛型类型参数,是的,由于装箱/拆箱会有一些性能损失(大部分都可以自动完成).

以下是Java Generics FAQs的引用:

原始类型是否允许作为类型参数?

不可以.只有引用类型可以用作类型参数.参数化类型,例如List<int>或是Set<short>非法的.只有引用类型可用于实例化泛型类型和方法.而不是List<int>我们必须声明一个List<Integer>,使用相应的包装类型作为类型参数.

[...]注意,缺乏原始类型实例会导致性能损失.Autoboxing和-unboxing使得泛型类型的包装器类型实例在源代码中非常方便和简洁.但简洁的符号隐藏了这样一个事实,即幕后虚拟机创建并使用了大量的包装器对象,每个对象必须被分配并随后进行垃圾回收.使用泛型类型无法实现直接使用原始类型值的更高性能.只有常规类型才能提供使用基本类型值的最佳性能.

如果您绝对需要性能,Trove有许多专门用于基本类型的数据结构,但是对于大多数实际用途,使用带有Java Collections Framework类的盒装基元类型应该产生超过可接受的性能.

也可以看看