【问题标题】:Checked Exception Variance检查异常方差
【发布时间】:2015-07-01 21:47:46
【问题描述】:

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

示例

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    然后我们有一个方法

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

    如果用户使用了只抛出 MyIOException &lt;: IOException 的函数怎么办?他们应该能够使用它吗?

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

    您可以对异常使用与正常返回值相同的推理。它们某种返回值,只是不是普通的。

    【讨论】:

    • 嗯,它是一种有趣的语言,升级为90k LoC... 基本上是Java 所没有的一切。但无论如何,谢谢你的回答,虽然最后一句话就足够了。
    • @Clashsoft - 是的,我想它应该被视为返回类型。
    • @Clashsoft - 也许吧,但随后的诱惑就是复制返回值是什么(即协变),而不是考虑权衡。
    猜你喜欢
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 2012-02-03
    • 1970-01-01
    相关资源
    最近更新 更多