当前位置: 首页 > 知识库问答 >
问题:

java中参数化和原始类型实例化之间的区别[重复]

从烈
2023-03-14

比如说,我有一个类Alpha,有两个形式参数K和V

现在,我想用具体类型CK和CV初始化它的一个对象。

我想知道,它们之间有什么区别

Alpha<CK, CV> alpha = new Alpha<CK, CV>();

和,

Alpha<CK, CV> alpha = new Alpha();

因为,他们都不允许我写或读任何东西,除了他们声明的内容。而且,既然泛型只用于确保编译时的类型安全,那么如果我不能对它做任何错误,它为什么会抛出警告呢?

共有1个答案

夹谷和裕
2023-03-14

问题在于

Alpha<CK, CV> alpha = new Alpha();

在左边,您使用的是泛型类型阿尔法,而在右边,您使用的是原始类型阿尔法。Java中的原始类型实际上只存在于与前泛型代码的兼容性中,除非绝对必要,否则不应在新代码中使用。

就你最初的Alpha示例而言

List<String> strings = ... // some list that contains some strings

// Totally legal since you used the raw type and lost all type checking!
List<Integer> integers = new LinkedList(strings);

泛型的存在是为了提供编译时保护,防止出错。在上面的示例中,使用raw类型意味着您没有得到这种保护,并且在运行时会出现错误。这就是为什么不应该使用原始类型。

// Not legal since the right side is actually generic!
List<Integer> integers = new LinkedList<>(strings);

 类似资料:
  • 问题内容: 以下变量用法之间的区别是什么 VS 如果我们在一个班级中只有一个“ b”,那么哪个是更好的做法以及为什么。在什么情况下应该使用谁。 问题答案: 这些实际上有非常不同的含义。在情况1中,在构造时分配对象。它只能被构造一次(除非您是在课堂以外的地方重新分配它)。 在情况2中,您将在每次调用该方法时重新分配实例。

  • 问题内容: 有人可以解释一下这两种方法之间的区别吗?都一样吗 就解决方案而言,它们在我看来确实相同。如果它们相同,为什么需要? 方法1,无界 方法2,无界: 方法1,有界 方法2,有界: 问题答案: 它们相同,因为它们接受相同的参数类型。 但是,使用(或其他任何一种)标识类型可以让您在其他地方引用该类型。 编辑:示例: 您无限制的示例未充分利用参数化类型的功能。你有: 这对于打印字符串表示的示例就

  • 本文向大家介绍Java中的序列化和外部化之间的区别,包括了Java中的序列化和外部化之间的区别的使用技巧和注意事项,需要的朋友参考一下 序列化和外部化都是将对象转换为流字节并将字节流存储在数据库或内存中的过程。实现java.io.Serializable接口的类可以序列化。另一方面,根据应用程序的要求,外部化用于自定义序列化。外部化扩展了java.io.Serializable。  序号 键 序列

  • 问题内容: 我有一个笼子课: 我试图在另一个类main方法中实例化Cage对象: 我收到错误:笼子是原始类型。泛型Cage的引用应参数化。我尝试了几个想法,但对这种棘手的语法感到困惑:o( 问题答案: 是通用类型,因此您需要指定一个类型参数,例如这样(假设有一个): 您可以使用任何扩展的类型(甚至是自身)。 如果省略type参数,那么在这种情况下最终得到的是。但是,即使这是您想要的,您仍应明确声明

  • 本文向大家介绍SQL中的视图和实例化视图之间的区别,包括了SQL中的视图和实例化视图之间的区别的使用技巧和注意事项,需要的朋友参考一下 我们知道任何数据库的主要组成部分都是它的表,为了使数据可访问性自定义,有了视图的概念,换句话说,我们可以说借助表的视图,我们可以限制任何用户仅访问该数据应该由他访问。现在,基于视图的特征和特征,我们可以区分视图和实体化视图。 以下是视图和实例化视图之间的重要区别。

  • 问题内容: 我正在尝试这样做,但是不起作用: 我应该如何正确地做到这一点? 问题答案: 您不能,因为基元不是对象。 您目前正在尝试的还没有实例化- 它正在加载一个类。但是您不能对原始对象执行此操作。确实是用于类型的名称,无论何时获取其对象(例如,通过反射),但您都无法使用加载它。 参考:反射教程: 如果一个类的全限定名称可用,则可以使用静态方法Class.forName()获得相应的Class。