2012-03-29 95 views
0

我一直在阅读上泛型最近,我碰到这个方法来:爪哇 - 泛型方法

protected <V> RunnableScheduledFuture<V> decorateTask(Callable<V> callable, RunnableScheduledFuture<V> task) { 
     return new ExceptionHandlingFutureTask<V>(callable, task); 
    } 

你看,我明白了为什么有protected<V>。我不明白的是为什么有RunnableScheduledFuture后再次<V>。我把这个特殊的<V>从方法中解释出来,编译出来,没有错误。那么为什么作者决定把它放在那里呢?

回答

2

一般来说,你可以随时删除“无差错”仿制药,因为他们在Java中通过擦除实现的,所以实际的编译代码只是投警告无论如何都指的是原始类。 (也就是说,你需要插入一些强制类型来保持编译器的快乐)。

在后一种情况的光,通过从未来的泛型参数,你已经从“未来会返回一个V”变成“未来将返回东西”把它。如果没有泛型参数,人们需要将结果转换成他们想要的类型,编译器将无法检查该正确性他们。

这只是一样能够使用原始ArrayList代替ArrayList<Integer>;他们两人的“工作”,但后者更干净,更容易理解,由编译器类型检查的,不需要人工铸塑。

+0

Aaaaaaah,我明白了!非常感谢。现在有很多意义:) – 2012-03-29 08:59:40

1

因为您指定要返回RunnableScheduledFuture<V>,其中V与您输入的Callable类型相同。

如果删除<V>,你会如果你调用该方法以这种方式

RunnableScheduledFuture<String> rsf = decorateTask(Callable<Integer> callable, RunnableScheduledFuture<Integer> task); 

没有错误但是,如果不删除<V>,这会给你一个编译器错误。

0

,因为他希望避免在

ExceptionHandlingFutureTask<V> var = decorateTask(...); 
0

由于RunnableScheduledFuture需要一个参数化的类型。即使您可以从代码中删除参数化类型(并因此成为原始类型),也可以对类定义进行参数化。

删除参数化类型将要求您稍后将类型转换为适当的类型。