Прежде всего, давайте очистим терминологию, ваша class
Add
просто не implement
черта Operator
, которую вы определили.Вы не должны и не можете использовать четко определенные термины для обозначения чего-то иного, отличного от их фактического значения.
Теперь вы ищете structural types
, а не traits
.
Позволяетопределить strucural type
с именем IsOperator
,
type IsOperator = {
def operate(a: Int, b: Int): Int
}
И давайте определим что-то логическое, что использует это,
def perform(a: Int, b: Int, o: IsOperator): Int = o.operate(a, b)
Теперь, любой object
или экземпляр любого class
который подтверждает structural type
IsOperate
(имеет метод с именем operate
с типом (Int, Int) => Int
), может использоваться с perform
.
object Add {
def operate(a: Int, b: Int): Int = a + b
}
val sum = perform(1, 2, Add)
// sum: Int = 3