当您的方法实际上并不关心实际类型时,未绑定类型可能很有用。
一个原始的例子是这样的:
public void printStuff(Iterable<?> stuff) { for (Object item : stuff) { System.out.println(item); }}
由于
PrintStream.println()可以处理所有引用类型(通过调用
toString()),因此我们 不在乎
该引用的实际内容
Iterable是什么。
而 来电者 可以在通过
List<Number>或
Set<String>或
Collection<? extendsMySpecificObject<SomeType>>。
还要注意,根本不使用泛型(使用原始类型进行调用)会产生完全不同的效果:这会使编译器处理 整个对象 ,就好像泛型 根本不存在一样
。换句话说:不仅会忽略类的类型参数,还会忽略方法上的所有泛型类型参数。
另一个重要的区别是,您不能将任何(非
null)值
Collection<?>添加到,而可以将 所有 对象添加到原始类型
Collection:
这不会编译,因为的type参数
c是未知类型(=通配符
?),因此我们无法提供保证可分配给该值的值(
null,可分配给所有引用类型的值除外)。
Collection<?> c = new ArrayList<String>();c.add("foo"); // compilation error
如果不使用type参数(即使用原始类型),则可以向集合中添加 任何内容 :
Collection c = new ArrayList<String>();c.add("foo");c.add(new Integer(300));c.add(new Object());
请注意,编译器会 警告 您不要使用原始类型,尤其是出于这个原因:它会删除与泛型相关的所有类型检查。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)