gpt4 book ai didi

java - 泛型:为什么在方法参数传递中允许使用通配符进行强制转换,反之亦然?

转载 作者:行者123 更新时间:2023-12-01 06:22:51 27 4
gpt4 key购买 nike

我有以下代码:

public static void swap(List<?> list) {
swapHelper(list); //1
}

private static <E> void swapHelper(List<E> list) {
swap(list); //2
}

{
List<?> tW = new ArrayList<>();
List<E> tE = new ArrayList<>();

tW = tE; // 3
tE = tW; // 4
}

在这段代码中,第 1 行和第 2 行编译成功,这是否意味着:我可以指定 List<?> 的引用到List<E>的那个反之亦然?如果是这样,那么为什么第 4 行无法编译。

最佳答案

两者<?><E>是未知类型;但全部List<?> s 具有 some 类型的元素,因此您可以调用参数为 List<E> 的方法,因为有一些未知类型与其匹配。

请注意,您不能执行此操作:

public static void swap(Object object, List<?> list) {
swapHelper(object, list); // Compiler error: object not in bounds of list.
}

private static <E> void swapHelper(E object, List<E> list) {
swap(object, list); // OK.
}

因为你现在不知道是否ObjectList<?> 的范围内.

您也不能向列表中添加新的非空值:

private static <E> void swapHelper(List<E> list) {
list.add(new E()); // Can't create an instance of type variable.
swap(list);
}

但是您可以添加从列表中获取的值,因为已知它们在列表的范围内:

private static <E> void swapHelper(List<E> list) {
list.add(list.get(0));
swap(list);
}

因此调用原始 swapHelper 是类型安全的来自swap ,因为你不能导致无法转换为 E 的事情(无论该类型是什么)到列表中。

tW 类似和tE :

  • 如果您指定 tW = tE ,您无法向 tW 添加任何内容除了 null ,所以你不能输入 tE处于包含 E 实例以外的任何内容的状态.
  • 如果您被允许分配 tE = tW ,您可以添加E的非空实例至tE 。这可能意味着您可以将错误类的实例添加到 tW ,可能导致运行时类型错误。因此,该分配是被禁止的。

请记住,分配列表不会导致列表被复制:如果您分配 tE = tW ,然后tE == tW ,因此所有更改都应用于 tE也可以通过 tW 看到,因为它们是同一个实例。

关于java - 泛型:为什么在方法参数传递中允许使用通配符进行强制转换,反之亦然?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40236329/

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