Java:将throw-attribute设为通用是否有意义?

时间:2010-09-30 16:58:00

标签: java exception generics

当您以某种形式将回调传递给另一个函数时,您通常必须填充一些接口以便能够传递此类回调。该回调接口通常会限制您可以抛出的异常类型。

对我来说最自然的方式是被调用的函数会自动重新抛出(或忽略)回调抛出的异常。即它会自动继承它可以从回调中抛出的异常列表。即它可以抛出的异常列表是通用的。

已经有可能吗?如果是这样,为什么它不被Javas库使用呢?

如果还不可能,为什么不呢?将其包含在语言中并不复杂。它会使一些事情更加清洁(见上文)。


一个例子:

我偶然发现Comparator.compare无法抛出异常(请参阅here了解相关问题)而Collections.sort(或使用Comparator的其他函数)也不会

如果Comparator.compare可以抛出的异常是通用的并且Collections.sort会抛出相同的内容,那对我来说会更有意义。这将以更加自然和干净的方式解决my problem here

5 个答案:

答案 0 :(得分:5)

我没有看到任何合理的理由为什么订购对象应该抛出异常。如果订购是“未指定的”,我只返回-1,以便它落在最顶层。

答案 1 :(得分:4)

我认为通过比较器抛出异常会破坏single responsibility principlecompare()方法的唯一工作是获取两个值并返回比较结果,而对象的有效性应该在之前的呼叫者。

答案 2 :(得分:0)

对于每个单独的实现复杂化这样的API是没有意义的,并且使用Comparator的每一段代码只需要抛出一个检查异常的边缘情况就可以抛弃它们而不是包裹在RuntimeException。我还认为你在谈论诸如“自然”或“干净”之类的主观事物时犯了一个错误。我个人认为,必须使用<Foo, RuntimeException>作为所有Comparator的99.9%的类型签名,这一点都不干净。

答案 3 :(得分:0)

我认为总是可以安排事情,以便compare()不必抛出异常。

例如,在上一个问题的情况下,人们可以循环生成数据(并抛出任何异常)。可以存储这些值,然后在compare()中使用。

答案 4 :(得分:0)

还没有人给出答案(大多数答案仅针对我的例子,为什么在这种情况下可能不是一件好事),所以我在这里尝试自己回答:

不,这还不可能。

最不可能的原因是为了让事情变得更加简单。否则,没有具体原因。