gpt4 book ai didi

java - 泛型。使用通配符 `` 与使用类型参数 ``

转载 作者:行者123 更新时间:2023-12-02 10:46:37 24 4
gpt4 key购买 nike

所以我已经完成了官方的java教程,https://docs.oracle.com/javase/tutorial/java/generics/index.html ,也搜了一下stackoverflow,结果发现使用<E>没有太大区别和<?> ,据我所知,一种是正常的通用形式,另一种是通配符。到目前为止,我遇到的唯一区别是使用 <E> 时或<E extetnds BlaBlaClass>我们可以将该类型称为 E ,否则我们根本不知道有关集合、数组或类型的任何信息。

我的问题是:使用 <?> 有什么好处吗? (通配符)超过普通泛型 <E> ?如果是的话,这种情况是怎样的情况?为什么有人会使用通配符?

我看过Difference between generic type and wildcard type , Difference between ? (wildcard) and Type Parameter in Java , When to use generic methods and when to use wild-card? , Java Generics ? , E and T what is the difference? 。到目前为止看起来像 <?><E> 的较差版本

最佳答案

无界通配符?在泛型类型是什么并不重要的情况下很有用。假设您有一个方法来检查列表的大小,如果列表太大则将其清除,并且您希望它接受具有任何类型元素的列表:

public static <E> void checkList(List<E> list, int max) {
if (list.size() > max) list.clear();
}

您声明类型变量 E ,但是size()clear()方法不需要它,所以它没有被使用。相反,您可以这样做:

public static void checkList(List<?> list, int max) {
if (list.size() > max) list.clear();
}

这简化了方法声明,并使其他程序员清楚地知道该方法与列表元素的类型无关。

<小时/>

无界通配符还可以用在字段或局部变量声明(无法声明类型变量的情况)中,以允许为任何泛型类型分配值。

public static void main(String[] args) {
List<?> list;
list = new ArrayList<Object>();
list = new ArrayList<String>();
list = new ArrayList<Integer>();
}

如果这是List<Object> ,最后两行将无法编译。可能是<? extends Object> ,但这相当于 <?> .

举一个更实际的例子,假设您想要一个 map ,其中值可以是任何列表:

public class MyClass {
public final Map<String, List<?>> lists = new HashMap<>();
}
<小时/>

最后,如果您需要将值转换为泛型类并且不确定其类型参数,则必须使用 ?对于他们来说。 (切勿使用 raw types ,它会禁用泛型类型安全检查。)常见的 equals() 就是一个很好的例子。实现:

@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
MyClass<?> other = (MyClass<?>) obj;
if (!myField.equals(other.myField)) return false;
return true;
}
<小时/>

有关 Java 泛型的更多信息,请查看 Angelika Langer 的 Generics FAQ .

关于java - 泛型。使用通配符 `<?>` 与使用类型参数 `<E>`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45086324/

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