Ответ 1
Когда вы пишете
def check[T <: AnyVal] ...
вы определяете метод для all подтипов AnyVal
.
Однако ваша реализация использует два метода (<=
и >=
), которые доступны только для подмножества типов, а именно тех, которые поддерживают упорядочение.
Итак, вы должны указать, что метод применяется к типам all, для которых существует , или другими словами
def check[T](value: T, min: T, max: T)(implicit ev: T => Ordered[T]): Boolean =
value >= min && value <= max
Этот синтаксис эквивалентен представлению (<%
)
def check[T <% Ordered[T]](value: T, min: T, max: T): Boolean = ...
но поскольку ограничения просмотра устарели, вам следует избегать этого.
Другой вариант - использовать Ordering
таким образом
def check[T](value: T, mini: T, maxi: T)(implicit ord: Ordering[T]): Boolean = {
import ord.mkOrderingOps
value >= mini && value <= maxi
}
где импорт ord.mkOrderingOps
дает вам возможность использовать обычные методы >=
и <=
.
Другая эквивалентная альтернатива, использующая прямой контекст:
def check[T: Ordering](value: T, mini: T, maxi: T): Boolean = {
val ord = implicitly[Ordering[T]]
import ord.mkOrderingOps
value >= mini && value <= maxi
}