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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |