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

之间的区别?(通配符)和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();
}

问题答案:

它们相同,因为它们接受相同的参数类型。

但是,使用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<? extends T>更多的灵活性)。

您还问“为什么需要??”。真正的答案是:您不会。我想这主要是为了美学。Java致力于成为一种精确而整洁的语言。在很多情况下,您根本不在乎所指的是哪种类型。在这些情况下,可以使用?未使用的类型参数声明来避免代码混乱。



 类似资料:
  • 有人能解释一下这两种方法的区别吗?它们是一样的吗?在我看来,它们解决的问题是一样的。如果它们相同,为什么需要<代码> ? 方法#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时,出现错误。请在这里说明问题是什么?

  • 问题内容: 给定跟随类层次结构,以下语句的动态和静态类型是什么? 类层次结构: 对于以下每个语句,静态类型?动态类型?: 我 知道我的答案/问题将是静态和动态类型的Fruit。 在编译时将为Alpha类型(静态),在运行时将为Fruit类型(动态)。 在编译时将为Gamma类型(静态),在运行时将为Fruit类型(动态)。 但是我不知道其他两个答案。Beta b = f是一个实例,其中同一超类的两