gpt4 book ai didi

Java 泛型 : List, 列表<对象>、列表

转载 作者:IT老高 更新时间:2023-10-28 13:51:04 28 4
gpt4 key购买 nike

有人可以尽可能详细地解释以下类型之间的区别吗?

List
List<Object>
List<?>

让我更具体一点。我什么时候想使用

// 1 
public void CanYouGiveMeAnAnswer(List l) { }

// 2
public void CanYouGiveMeAnAnswer(List<Object> l) { }

// 3
public void CanYouGiveMeAnAnswer(List<?> l) { }

最佳答案

正如其他帖子所指出的,您正在询问一个称为泛型的 Java 功能。在 C++ 中,这称为模板。 Java 中的这一特性通常比 C++ 中的特性更易于使用。

让我从功能上回答你的问题(如果这对于 OO 讨论来说不是一个调皮的话)。

在泛型之前,有像 Vector 这样的具体类。

Vector V = new Vector();

vector 包含你给他们的任何对象。

V.add("This is an element");
V.add(new Integer(2));
v.add(new Hashtable());

他们通过将赋予它的所有值转换为一个 Object(所有 Java 类的根)来做到这一点。当您尝试检索存储在 Vector 中的值时,您需要将该值转换回 original 类(如果您想对它做任何有意义的事情)。

String s = (String) v.get(0);
Integer i = (Integer) v.get(1);
Hashtable h = (Hashtable) v.get(2);

铸件很快就会变老。不仅如此,编译器还会向您提示未经检查的强制转换。像这样的转换最紧迫的问题是 Vector 的使用者必须在 编译时 知道其值的类别才能正确转换。如果 Vector 的生产者和 Vector 的消费者彼此完全隔离(想想 RPC 消息),这可能是一个致命的问题。

输入泛型。泛型尝试创建强类型类来执行泛型操作。

ArrayList<String> aList = new ArrayList<String>();
aList.add("One");
String element = aList.get(0); // no cast needed
System.out.println("Got one: " + element);

设计模式一书鼓励读者从契约的角度思考,而不是具体的类型。将变量与其实现类分离是一种智慧(和代码重用)。

考虑到这一点,您可能会认为所有实现 List 对象都应该做同样的事情:add() , get() , size()等等。稍微思考一下,您可以想象许多 List 操作的实现以各种方式遵守 List 协定(例如 ArrayList )。但是,这些对象处理的数据类型与对它们执行的操作是正交的。

把它们放在一起,你会经常看到以下几种代码:

List<String> L = new ArrayList<String>();

您应该将其理解为“L 是一种处理字符串对象的列表”。当您开始处理工厂类时,处理契约(Contract)而不是具体实现至关重要。工厂在运行时产生各种类型的对象。

使用泛型非常容易(大多数时候)。

有一天,您可能决定要实现自己的泛型类。也许您想编写一个新的数据库抽象接口(interface),以消除各种数据存储之间的差异。当您定义该泛型类时,您将使用 <t>作为将由方法操作的对象类型的占位符。

如果您仍然感到困惑,请使用 List 的泛型类,直到您感到舒服为止。稍后,您可以更有信心地深入实现。或者,您可以查看 JRE 附带的各种 List 类的源代码。开源就是这样。

看看 Oracle/Sun docs about generics .干杯。

关于Java 泛型 : List, 列表<对象>、列表<?>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/490091/

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