加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala类型的上限和下限

发布时间:2020-12-16 18:25:07 所属栏目:安全 来源:网络整理
导读:考虑以下层次结构: class C1class C2 extends C1class C3 extends C2class C4 extends C3 我想编写一个只接受C2和C3类型的函数.为此我想到了以下内容: def f [C : C3 : C2](c :C) = 0 我期待以下行为 f(new C1) //doesn't compile,okf(new C2) //compiles,
考虑以下层次结构:

class C1
class C2 extends C1
class C3 extends C2
class C4 extends C3

我想编写一个只接受C2和C3类型的函数.为此我想到了以下内容:

def f [C >: C3 <: C2](c :C) = 0

我期待以下行为

f(new C1)  //doesn't compile,ok
f(new C2)  //compiles,ok
f(new C3)  //compiles,ok
f(new C4)  // !!! Compiles,and it shouldn't

问题是用C4调用它,我不想允许,但编译器接受.我知道C4<:C2是正确的,C4可以看作C3.但是当指定绑定[C>:C3<:C2]时,我希望编译器找到一个同时尊重两个边界的C,而不是一个接一个. 问题是:有没有办法实现我想要的,如果没有,编译器是否试图避免与此有些不一致? 编辑:从答案中我意识到我的推定是错误的. C4总是满足C>:C3,所以两个界限确实都得到了尊重.我的用例的方法是C3<:< C.

解决方法

静静地,是的.施加此约束非常简单:

def f[C <: C2](c: C)(implicit ev: C3 <:< C) = 0

f(新C4)现在不会编译.

问题是,在编译时可能无法禁止以下行为:

val c: C3 = new C4
f(c)

这里变量c有静态类型C3,它通过编译器传递任何类型的类型检查,但它在运行时实际上是C4.

在运行时,您当然可以使用反射或多态检查类型并抛出错误或返回Failure(…)或None

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读