Ответ 1
Это обычно называется структурной типизацией, а не утиной. Я редактировал ваш заголовок.:)
Я думаю, что ваша проблема вызвана определением параметра типа T
, а затем его использованием инвариантным способом. T
может относиться только к одному конкретному типу, но у вас есть параметры разных типов A
и B
.
Это работает:
def bar(param: {def foo: Unit}*) = param.foreach(x => x.foo)
Изменить: использование псевдонима типа также работает:
type T = {def foo: Unit}
def bar(param: T*) = param.foreach(x => x.foo)
Это работает, потому что компилятор просто заменит структурный тип вместо своего псевдонима T
. После подстановки этот пример в точности совпадает с приведенным выше.