考虑这段剪辑代码:
public class MaxSizeHandler extends AbstractValueHandler<Collection> {
}
我使用eclipse,它警告我为Collection添加推断通用参数类型,代码更改如下:
public class MaxSizeHandler extends AbstractValueHandler<Collection<?>> {
}
我的问题是,如果我没有说出来,问题是什么,或者如果我把它放在什么地方有什么优势呢?
答案 0 :(得分:5)
传递原始Collection
意味着Collection
没有参数化,因此您失去了强烈键入(即在编译时)Collection
中的内容的能力。
传递Collection<?>
并没有什么不同,因为通配符会匹配任何扩展Object
的内容。
当然,它会删除警告。
最好的方法是传递Collection<MyObject>
或Collection<? extends MyObject>
等。
答案 1 :(得分:1)
你需要在通用格式之前提及Collection类型,如下所示:
public class MaxSizeHandler extends AbstractValueHandler<Collection<? extends T>> {
}
T-&GT;集合的类型 否则java编译器将采用默认的集合类型。
答案 2 :(得分:0)
添加正确的类型将允许类返回正确的值类型,是否存在Collection
将保留的特定类型的对象,即Integer
,然后使用AbstractValueHandler<Collection<Integer>>
。< / p>
答案 3 :(得分:0)
根据您使用MaxSizeHandler
类的方式,将此类本身设为通用可能是有意义的。例如,如果您需要迭代集合:
public class MaxSizeHandler<T>
extends AbstractValueHandler<Collection<? extends T>> {
public void handle(Collection<? extends T> coll) {
for(T item : coll) {
// ...
}
}
}
或者如果您需要向集合中添加新项目:
public class MaxSizeHandler<T>
extends AbstractValueHandler<Collection<? super T>> {
public void handle(Collection<? super T> coll) {
T item = createAnItem();
coll.add(item);
}
}
(这些只是玩具示例,因为您还没有说明AbstractValueHandler
声明了哪种方法
答案 4 :(得分:0)
我在这个链接中找到了自己的答案 What is a raw type and why shouldn't we use it?
the section that ask this question
How's a raw type different from using <?> as a type parameter?