检查异常方差
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 类型的值,只是不正常。
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 类型的值,只是不正常。