我应该总是使用泛型吗?

6
我创建了一个单元测试:
new Callable() {
@Override
public Object call() throws
         .....

我在 Eclipse 中收到了警告:

Callable is a raw type. References to generic type Callable<V> 
should be parameterized

我应该像这样编写代码吗:

new Callable<Object>()  

为了消除警告,还是不消除?看起来只有junit测试,添加额外的代码没有意义...谢谢。


1
如果你关心测试(你应该关心),那么请按照与你的代码相同的标准编写测试 - 它们也需要可靠并且进行维护... - assylias
3个回答

8
是的,避免使用原始类型并使用泛型类型是一个好习惯。使用 Callable<Object> 可以清楚地表明 Callable 旨在返回任何类型的对象。而使用Callable则无法清晰地表达这一点。

当大多数人不必编写许多签名的库时,他们通常喜欢泛型,例如<? extends T><? super T><R extends Reference<? extends T>> R foo(R ref)。尽管我通常很勤奋地使用超级冗长的签名,但我仍然会禁用原始类型警告的其中一个原因是:D - bestsss
使用Callable<Object>可以清楚地表明Callable意图返回任何类型的对象。但这也可能会令人困惑 - 我并不打算返回任何东西。我之所以使用Callable,只是因为它可以抛出异常,这样我就可以在外部代码块中处理它。 - user710818
2
然后将其作为@MartinK在其答案中展示的Callable<Void>,这使得Callable不返回任何内容。 - JB Nizet

7

如果您的操作不返回任何值(或者没有有意义的返回值),您应该使用 java.lang.Void 作为类型参数。

new Callable<Void>() {

  public Void call() throws Exception {
    // do work
    return null; // <-- This statement is required.
  }

}

3

Runnable是Callable<Void>的一个很好的替代品。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接