检查异常差异

时间:2015-07-01 21:47:46

标签: java scala generics variance generic-type-argument

Java支持Checked Exceptions,但默认情况下在声明站点处是不变的。 Scala允许使用+T-T进行方差注释,但没有Checked Exceptions。我目前正在设计/实现一种应该支持这两种语言的语言,所以我想知道方差如何适用于已检查的异常。

实施例

interface Function[-P1, +R, E]
{
    public R apply(P1 par1) throws E
}

E应具有哪种方差注释,或者它是不变的?此外,如果它具有相反的方差注释,我应该生成错误吗?类似于Scala中如果使用协变类型参数作为函数参数类型会出现错误?

1 个答案:

答案 0 :(得分:1)

这样的事情所有语言设计的时间,并且存在健全性等问题,所以花点时间在语言的其他方面考虑这些问题!

但是,无论如何,这取决于你的意思。我们假设有

interface IOFunction[-P1, +R, E <: IOException] extends Function[P1,R,E]

然后我们有一个方法

public R doIo[P1, R](f: IOFunction[P1, R, IOException]) ...

如果用户手上只投掷MyIOException <: IOException的函数怎么办?他们应该能够使用吗?

如果是,那就是协方差的全部意义。如果不是,则必须完全是IOException或什么都不是,然后使用不变性。

您可以将异常的相同推理用作正常返回值。他们 是各种各样的返回值,而不是正常的。