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