gpt4 book ai didi

Java 泛型、对象和通配符的区别和说明

转载 作者:搜寻专家 更新时间:2023-10-31 19:32:25 25 4
gpt4 key购买 nike

我想理解这个概念:

  1. T对象 - 通用,将被删除为实际类型。
  2. ?对象 - 将被删除成什么?
  3. Object对象;

T 之间有什么区别? , ?Object

我很容易理解#1,但是:

Object var;
? var;

两者有什么区别?我读到我不能使用 ?明确地,像T或任何其他变量,并且?与对象相关,与类型无关。
但实际原因是什么?为什么我不能只写一个 List对象 ( List<Object> ) 而不是 List通配符(List<?>)?因为我不知道这两种情况下的对象类型。
另外,我想知道?的删除是什么? ?

最佳答案

我将列出 T 之间的主要区别和 ? :

  • 基本:T是类型参数,?是通配符。

  • 含义:T在定义泛型类时用作类型参数。 T当您实例化通用类时,将被具体类型替换。另一方面,我们使用 ?当我们想要引用一个未知类型的参数时。

  • 定义地点:需要声明T如果您定义了泛型方法,则在类或方法的顶部。您可以使用 ? 无处不在
  • 映射:每次使用 T映射到同一类型(在同一类中)。每次使用 ?可以映射到不同的类型。
  • 对象实例化:您可以使用通用参数 T 创建对象喜欢new ArrayList<T>() .你不能用 ? 实例化对象,只能实例化指针 .
  • 集合更新:您可以将对象添加到 T 类型的集合中.您不能将对象添加到 ? 类型的集合中(因为你不知道它的类型)。

  • 类型删除:对于泛型,类型删除适用于泛型的使用。当使用泛型时,它们被转换为编译时检查和执行时强制转换。因此,如果您有以下代码:List<String> myList = new ArrayList<String>();然后你想添加到你的列表,所以你做 myList.add("Hello World");然后你想get您刚刚通过执行 String myString = myList.get(0); 添加的项目然后编译器会将您的代码编译为List myList = new ArrayList();String myString = (String) myList.get(0); (由于显而易见的原因,add 保持不变)。
    所以基本上,在执行时没有办法找出T本质上是 String对于列表对象(该信息消失了)。

    现在对于通配符来说,情况就不同了。通配符 ( ? ) 替换为 Object (因为它是无界)。这不是很有用。在构建时,编译器将检查您调用Object的行为。如果你有类似 ? extends Foo 的东西, 然后是 ?被其绑定(bind) Foo 取代(在构建时,编译器将检查您是否仅将 Foo 或其任何子类型(从 Foo 继承的类型)作为参数传递)。

对于 ? 之间的差异和 Object & TObject你可以阅读 herehere分别。

关于Java 泛型、对象和通配符的区别和说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34993626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com