考虑以下层次结构:
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
. 但是在指定 bound 时[C >: C3 <: C2]
,我希望编译器找到一个C
同时尊重两个边界的,而不是一个一个。
问题是:有什么方法可以实现我想要的,如果没有,编译器是否试图避免与此不一致?
编辑:从答案中我意识到我的假设是错误的。C4
总是满足C >: C3
,所以这两个界限确实受到尊重。我的用例的方法是C3 <:< C
.