- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我不明白未绑定(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/
我是一名优秀的程序员,十分优秀!