检查异常方差

Checked Exception Variance

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

例子:

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

E应该有什么样的方差标注,还是不变的?此外,如果它具有相反的方差注释,我是否应该生成错误,类似于在 Scala 中如果使用协变类型参数作为函数参数类型会出现错误?

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

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

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

然后我们有一个方法

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

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

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

您可以使用与正常 return 值相同的异常推理。它们 一种 return 类型的值,只是不正常。