лестницу Рассмотрим следующую иерархию:Верхняя и нижняя граница типа
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
.