gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:18:45 26 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<?>。 , 但可以将 all 对象添加到原始类型 Collection :

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

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

如果您不使用类型参数(即使用原始类型),那么您可以将 anything 添加到集合中:

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/7671072/

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