Рассмотрим следующую иерархию:
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
.