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

两者之间的区别?Java中的(通配符)和类型参数

寇夜洛
2023-03-14

有人能解释一下这两种方法的区别吗?它们是一样的吗?在我看来,它们解决的问题是一样的。如果它们相同,为什么需要<代码>

方法#1,无界

public static void printList(List<?> list) {
    for (Object elem : list)
        System.out.println(elem + " ");
    System.out.println();
}

方法#2,无界:

public static <T> void printList(List<T> list) {
    for (Object elem : list)
        System.out.println(elem + " ");
    System.out.println();
}

方法#1,有界

public static void printList(List<? extends Number> list) {
    for (Object elem : list)
        System.out.println(elem + " ");
    System.out.println();
}

方法#2,有界:

public static <T extends Number> void printList(List<T> list) {
    for (Object elem : list)
        System.out.println(elem + " ");
    System.out.println();
}

共有3个答案

堵毅然
2023-03-14

如上所述,声明泛型代码不需要对类型的任何引用。正如Java中指出的,这可能是一个属性独立于任何类型(如集合长度)的类。

另一个原因是什么 是指当泛型代码只需要类对象提供的行为时,它提供了较少歧义的语法。如上所述,参数类型<代码>

所以如果

所以,

何博涛
2023-03-14

在你的例子中,完全没有区别。每个都会产生相同的输出。

泛型的最佳使用和解释要求您了解类型参数的语义以及参数的角色。原因是,在上面的第一个示例(无界通配符)中,语义是“未知类型的对象列表”和“将产生(不消耗)列表的参数”

上述方法仅生成每个列表

注意,如果<代码> 具有相同的语义(“未知类型的对象列表”),但用途不同(“列表将使用未知类型的对象”),事情会发生非常、非常彻底的变化,因此使用通配符参数(至少在没有辅助方法来捕捉对象类型的情况下)可能是不明智的(或非常困难的)。

通常不可能为所有情况断言一种通用参数形式。使用的最佳形式(通配符与具体;有界与无界;扩展与超级)取决于类型参数的语义以及参数在方法中的作用。

微生毅
2023-03-14

它们的相同之处在于它们接受相同的参数类型。

但是,用T(或任何东西)标识类型可以让您在其他地方引用该类型。

编辑:示例:

您的无界示例没有充分利用参数化类型的功能。您有:

public static <T> void printList(List<T> list) {
    for (Object elem : list)
        System.out.println(elem + " ");
    System.out.println();
}

对于打印字符串表示的示例来说,这已经足够了,但请考虑一下(非常人为的,没有错误处理):

public static <T> T getSecondItem (List<T> list) {
    T item = list.get(1);
    return item;
}

返回类型是T,它允许您通过编译时类型检查安全地执行以下操作:

class MyClass {
    public void myMethod () { }
}

void somewhere () {
    List<MyClass> items = ...;
    getSecondItem(items).myMethod();
}

命名类型还允许您在多个位置共享同一类型约束,例如:

public <T> int compareLists (List<T> a, List<T> b) {
    ...
}

如果您没有命名类型,则无法指定ab是相同列表类型的约束(您可以使用List

您还问“为什么我需要??”。真正的答案是:你没有。我想这主要是为了美学。Java力求成为一种精确且无杂乱的语言。在很多情况下,你根本不在乎你指的是哪种类型。在这种情况下,您可以使用 没有杂乱的代码和未使用的类型参数html" target="_blank">声明。

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

  • 问题内容: 我是Generic的新手,我的问题是:两个函数之间有什么区别: 功能1: 功能2: 问题答案: 第一个签名说:是一个ES列表。 第二个签名说:是某种类型的实例的,但是我们不知道类型。 当我们尝试更改方法时,区别变得明显,因此它需要第二个参数,该参数应添加到方法内部的列表中: 第一个效果很好。而且你不能将第二个参数更改为可以实际编译的任何参数。 实际上,我发现了一个更好的区别说明: 一个

  • 问题内容: 比Stack Overflow问题更具体一点 什么是存在类型? ,最好有一些说明性的示例,Scala的 存在类型 和Java的 通配符有 什么区别? 到目前为止,在我所看到的所有内容中,它们似乎都相当。 一些参考。 马丁•奥德斯基( Martin Odersky)提到他们 ; Google 对我的问题影响最大 : MO: 最初的通配符设计…受存在类型的启发。实际上,原始论文对存在类型进

  • 问题内容: 我正在阅读有关泛型的信息,但我不了解未绑定通配符的需求以及它与原始类型的区别。我读了这个问题,但仍然不清楚。在未绑定通配符的 Java教程页面中,我得到了以下两点,但我不明白第一点: 如果您正在编写可以使用该类中提供的功能实现的方法。 * 当代码在泛型类中使用不依赖于type参数的方法时。例如,或。实际上,之所以经常使用它是因为其中的大多数方法都不依赖。 有人可以用外行语言解释未绑定的

  • 问题内容: Java Generic type:之间有什么区别 根据我的理解 (1) 是具有超类“ Number”的“未知”数据类型的只读列表。我们只能读取元素,但不能添加 (2) 具有超类“ Number”的数据类型列表。我们可以 阅读并将 元素 添加 到列表中 请参见下面的代码示例 当我尝试将Integer(甚至Number对象)添加到sumOfList2时,出现错误。请在这里说明问题是什么?

  • createOrReplace eTempView和as函数别名火花sql查询使用的区别是什么? 我试图理解这两种方法之间的区别。