Принцип замены Лискова требует, чтобы реализация абстрактной функции принимала все типы, которые принимаются абстрактной функцией.
Чтобы избежать этого, необходимо иметь параметр типа в особенность в том, что разные реализации имеют разные интерфейсы и поэтому не должны соответствовать Лискову.
trait A[TypeClass[_]] {
def a[K: TypeClass]: Int
}
new A[SomeTypeClass] {
def a[K: SomeTypeClass]: Int = ???
}
или
trait A {
type TypeClass[_]
def a[K: TypeClass]: Int
}
new A {
type TypeClass[T] = SomeTypeClass[T]
def a[K: SomeTypeClass]: Int = ???
}