当前位置: 首页 > 面试题库 >

Java Noob:仅泛型覆盖对象?

羊舌兴德
2023-03-14
问题内容

我是Java新手。在编码Map <>时,我发现OK 声明Map<int, int>是语法错误Map<Integer, Integer>。在Java中,是否有可能实例化对象类型的泛型而不是基元?如果是这样,是否对基元进行装箱/拆箱会明显降低性能?


问题答案:

是的,您只能将引用类型用于泛型类型参数,是的,由于装箱/拆箱(在大多数情况下可以自动完成),因此会降低性能。

这是Java泛型常见问题解答的引文:

是否可以将原始类型用作类型参数?

不能。只能将引用类型用作类型参数。参数化类型,例如List<int>Set<short>非法。仅引用类型可用于实例化泛型类型和方法。代替List<int>我们必须声明a
List<Integer>,使用相应的包装器类型作为type参数

[…]注意,缺少原始类型的实例化会导致性能下降。自动装箱和-
unboxing使泛型类型的包装器类型实例化在源代码中非常方便和简洁。但是简洁的概念掩盖了以下事实:虚拟机在幕后创建并使用了许多包装对象,必须分配每个包装对象并随后收集垃圾。使用泛型类型无法实现直接使用原始类型值的更高性能。只有常规类型才能提供使用原始类型值的最佳性能。

如果您绝对需要性能,则Trove具有许多专门用于基元类型的数据结构,但是出于大多数实际目的,将装箱的基元类型与Java
Collections Framework类一起使用应该会产生超过可接受的性能。

也可以看看

  • 有效的Java 2nd Edition,项目49:首选基本类型胜于盒装类型
  • Java语言指南/自动装箱
  • Java语言指南/泛型
  • Java教程/泛型


 类似资料:
  • 我想在我的android项目中自动转换视图。所以,我想重写 方法 方法但是java编译不允许这样做,但是重写的方法不会与父方法冲突,并且总是返回视图对象或其子对象。我发现了一些信息,java不允许用泛型方法重写非泛型方法,但我找不到解释。 http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#FAQ8

  • 我在覆盖接口中声明的方法时遇到了一些问题,该方法使用泛型参数作为其异常,并使用泛型作为其参数之一。为了说明,我编写了以下代码接口 通过javac运行,我得到 请注意,在接口中,metodoA和metodoB之间的唯一区别在于它们的参数。 为什么Implementadora(Implementadora)的metodoB(metodoB)(代码)不重写Interfaz(代码),但重写metodoB(

  • 我定义了一个通用的环境特征: 为此,我提供了以下实现: 此外,我定义了一个通用事件特征,该特征具有一个接受通用环境作为参数的方法: 对于这个事件特征,我提供了以下实现,其中exec()方法接受MyEnvironment类型的参数,使我能够访问MyEnvironment的特定值。 然而,Scala编译器输出了一个错误,从中可以看出MyEnvironment似乎没有被识别为环境[整数]: 错误:方法e

  • 我正在尝试理解使用以下代码得到的名称冲突错误: 错误消息: 错误:名称冲突:

  • 我有一个问题,从抽象类中重写泛型方法。 这是我的抽象类: 当我创建类(B)来实现类(a)时,如下所示: 显示了(getData)方法中的以下编译错误: ”“B。getData“(“字符串函数(字符串)”不是“a”的有效重写。getData'('字符串函数(类型)‘)。dart(无效覆盖) 以及返回语句中的此错误: 类型为“String”的值不能从方法'getData'返回,因为它的返回类型为'St

  • 问题内容: 我对此有不同的疑问,但是我仍然觉得这个话题很混乱。 我要做的就是拥有一个实现接口的抽象类,并具有一个扩展此抽象类的类,以便硬类需要实现and ,而无需其他方法,因为该方法位于抽象类中。 我有以下界面。 还有这个抽象类 我想这样使用 但是,我得到 为什么没有正确覆盖它? 更新 感谢@Bozho,解决方案是这样的: 问题答案: 我建议使接口通用,而不仅仅是其方法: 然后