Java支持Checked Exceptions,但默认情况下在声明站点处是不变的。 Scala允许使用+T
和-T
进行方差注释,但没有Checked Exceptions。我目前正在设计/实现一种应该支持这两种语言的语言,所以我想知道方差如何适用于已检查的异常。
实施例 :
interface Function[-P1, +R, E]
{
public R apply(P1 par1) throws E
}
E
应具有哪种方差注释,或者它是不变的?此外,如果它具有相反的方差注释,我应该生成错误吗?类似于Scala中如果使用协变类型参数作为函数参数类型会出现错误?
答案 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或什么都不是,然后使用不变性。
您可以将异常的相同推理用作正常返回值。他们 是各种各样的返回值,而不是正常的。