【发布时间】:2015-10-15 01:08:02
【问题描述】:
考虑以下层次结构:
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。
【问题讨论】:
标签: scala types type-bounds