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

通用类型和通配符类型之间的区别

危文乐
2023-03-14
问题内容

我是Generic的新手,我的问题是:两个函数之间有什么区别:

功能1:

public static <E> void funct1  (List<E> list1) {

}

功能2:

public static void funct2(List<?> list) {

}

问题答案:

第一个签名说:list1是一个ES列表。

第二个签名说:list是某种类型的实例的List,但是我们不知道类型。

当我们尝试更改方法时,区别变得明显,因此它需要第二个参数,该参数应添加到方法内部的列表中:

import java.util.List;

public class Experiment {
    public static <E> void funct1(final List<E> list1, final E something) {
        list1.add(something);
    }

    public static void funct2(final List<?> list, final Object something) {
        list.add(something); // does not compile
    }
}

第一个效果很好。而且你不能将第二个参数更改为可以实际编译的任何参数。

实际上,我发现了一个更好的区别说明:

public class Experiment {
    public static <E> void funct1(final List<E> list) {
        list.add(list.get(0));
    }

    public static void funct2(final List<?> list) {
        list.add(list.get(0)); // !!!!!!!!!!!!!! won't compile !!!!!!!!!
    }
}

一个可能是为什么<?>当它仅限制我们可以使用它时(如@Babu_Reddy_H在注释中所做的那样),我们为什么需要它。我看到了通配符版本的以下好处:

调用者不必对传入的对象有所了解。例如,如果我有一个列表列表:Map<String, List<?>>我可以将其值传递给你的函数,而无需指定列表元素的类型。所以

如果我分发这样参数化的对象,则会积极地限制人们对这些对象的了解以及它们可以做什么(只要它们远离不安全的铸造)。

当我将它们结合在一起时,这两个是有意义的:List<? extends T>。例如,考虑一个method List<T> merge(List<? extends T>, List<? extends T>),它将两个输入列表合并到一个新的结果列表中。当然可以引入另外两个类型参数,但是为什么要这么做呢?这将超过指定的东西。

最后,通配符可以有一个较低的界限,因此使用列表可以使该add方法起作用,而get对你却没有任何帮助。当然,这引发了下一个问题:为什么泛型没有下界?



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

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

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

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

  • 问题内容: 抱歉,标题似乎令人困惑,但请按示例进行操作。 假设我有一些带有通用类型参数的Java类: 我可以创建一个类型为存储对象的变量,并将通用参数设置为。Java还允许我将该变量分配给另一个变量,但将通用参数设置为通配符类型: 但是,在使用具有泛型参数的类时,如果将该参数的类型设置为泛型,则无法将该类的对象分配给相同类型/泛型的类型,后者(内部/嵌套)参数是通配符类型: 具体的编译错误是: 凭

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