gpt4 book ai didi

java - Java中未绑定(bind)通配符泛型的用途和要点是什么?

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

我不明白未绑定(bind)通配符泛型有什么用。具有上限的绑定(bind)通配符泛型 <? extends Animal>非常有道理,因为使用多态性我可以使用该类型或集合。但是拥有可以是任何类型的泛型有什么意义呢?这不是违背了泛型的目的吗?编译器没有发现任何冲突,并且在类型删除之后,就像没有使用泛型一样。

最佳答案

当您的方法并不真正关心实际类型时,未绑定(bind)类型可能很有用。

一个原始的例子是这样的:

public void printStuff(Iterable<?> stuff) {
for (Object item : stuff) {
System.out.println(item);
}
}

PrintStream.println()可以处理所有引用类型(通过调用 toString() ),我们不关心 Iterable 的实际内容是什么。是。

调用者可以传入 List<Number>Set<String>Collection<? extends MySpecificObject<SomeType>> .

另请注意,根本不使用泛型(称为使用原始类型)会产生完全不同的效果:它使编译器处理整个对象,就好像泛型根本不存在一样。换句话说:不仅类的类型参数被忽略,方法上的所有泛型类型参数也被忽略。

另一个重要的区别是您不能将任何(非 null )值添加到 Collection<?> 中。 ,但可以将所有对象添加到原始类型 Collection :

这不会编译,因为 c 的类型参数是未知类型(= 通配符 ? ),因此我们无法提供保证可分配给该类型的值( null 除外,它可分配给所有引用类型)。

Collection<?> c = new ArrayList<String>();
c.add("foo"); // compilation error

如果您保留类型参数(即使用原始类型),则可以将任何内容添加到集合中:

Collection c = new ArrayList<String>();
c.add("foo");
c.add(new Integer(300));
c.add(new Object());

请注意,编译器会警告您不要使用原始类型,特别是因为这个原因:它会删除与泛型相关的任何类型检查。

关于java - Java中未绑定(bind)通配符泛型的用途和要点是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40786370/

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