gpt4 book ai didi

Java 泛型、对象和通配符的差异和说明

转载 作者:太空宇宙 更新时间:2023-11-04 12:56:53 24 4
gpt4 key购买 nike

我想理解这个概念:

  1. T object - 通用,将被删除为实际类型。
  2. ? object - 将被删除成什么?
  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/35323808/

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