我应该为通用类型添加<! - ? - >吗?

时间:2014-04-11 14:44:01

标签: java

考虑这段剪辑代码:

public class MaxSizeHandler extends AbstractValueHandler<Collection> {      
}

我使用eclipse,它警告我为Collection添加推断通用参数类型,代码更改如下:

public class MaxSizeHandler extends AbstractValueHandler<Collection<?>> {       
}

我的问题是,如果我没有说出来,问题是什么,或者如果我把它放在什么地方有什么优势呢?

5 个答案:

答案 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?