JavaNoob:仅对象上的泛型?

JavaNoob:仅对象上的泛型?,java,generics,Java,Generics,我是Java新手。在编写映射时,我发现声明Map是一个语法错误,而Map是可以的。是否只有在Java中才可能在对象类型上实例化泛型,而不是原语?如果是这样的话,对基本体的装箱/取消装箱是否会造成明显的性能损失?是的,您只能对泛型类型参数使用引用类型,是的,装箱/取消装箱会导致一些性能损失(大部分情况下可以自动完成) 以下是一段引用自: 是否允许基元类型作为类型参数? 不可以。只有引用类型可以用作类型参数。 参数化类型,如List或Set是非法的。只有引用类型可以用于泛型类型和方法的实例化。我们必

我是Java新手。在编写映射时,我发现声明
Map
是一个语法错误,而
Map
是可以的。是否只有在Java中才可能在对象类型上实例化泛型,而不是原语?如果是这样的话,对基本体的装箱/取消装箱是否会造成明显的性能损失?

是的,您只能对泛型类型参数使用引用类型,是的,装箱/取消装箱会导致一些性能损失(大部分情况下可以自动完成)

以下是一段引用自:

是否允许基元类型作为类型参数?

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

[…]注意,缺少基元类型实例化会导致性能下降。自动装箱和取消装箱使得在源代码中使用泛型类型的包装器类型实例化非常方便和简洁。但简洁的符号隐藏了这样一个事实:虚拟机在幕后创建并使用了大量包装器对象,每个包装器对象都必须分配,然后进行垃圾收集。使用泛型类型无法实现直接使用基元类型值的更高性能。只有常规类型才能提供使用基元类型值的最佳性能

如果您绝对需要性能,那么它有许多专门用于基本类型的数据结构,但出于大多数实际目的,将盒装基本类型与Java集合框架类一起使用应该会产生超过可接受的性能

另见
  • 有效Java第二版,第49项:首选基本类型而非盒装类型
是否只有在Java中才能 在对象上实例化泛型 类型,而不是原语

如果有,是否存在明显的问题 因以下原因而被罚款的行为: 基本体的装箱/拆箱

是的,有

有关详细说明,请参见此处:

1)是的,Java泛型仅适用于对象类型。这是因为它们是如何实现的,这是通过-本质上,一旦编译成字节码,所有泛型类型都被
对象
替换-这样做是为了让java泛型可以在不修改底层JVM/字节码的情况下工作(错误的决定,imo)


2) 是的,会有一些装箱/拆箱处罚;恐怕这是不可避免的

正如其他人所指出的,对原语使用包装类会造成性能损失。即使代价不是很明显,如果您真的需要额外的性能提升,您也可以简单地为List类创建自定义子类,每个基元类型一个(它们不多,所以这不是问题),并简单地重写在列表中放置和获取值的方法,并限制它们接受每个基元。这将提高性能,并保持通用列表代码的详细性。

正如其他人所指出的,存在明确的性能损失。然而,分析工具的显著性和用户的显著性之间有很大的区别。单独实现
List
不会带来任何性能提升,因为公共界面仍然需要装箱。您需要重载(而不是重写)所有方法,如果这样做,那么为什么首先要实现
List
?我想到的是将一个具体的列表实现子类化,比如LinkedList。您可以将LinkedList子类化,并提供“包装器”方法来添加和检索整数,而不是整数,例如。。。