Структурный тип в методе параметризации типа в Scala? - PullRequest
11 голосов
/ 30 сентября 2011

Рассмотрим следующий код Scala (например, в REPL)

object A{def foo:Unit = {}}
object B{def foo:Unit = {}}

def bar[T <: Any {def foo: Unit}](param: T*):Unit = param.foreach(x => x.foo)

bar(A, A)  // works fine
bar(B, B)  // works fine
bar(A, B)  // gives error

Первые два работают нормально.Третий выдает ошибку:

error: inferred type arguments [ScalaObject] do not conform to method bar's type parameter bounds [T <: Any{def foo: Unit}]

Есть ли способы сделать то, что я хочу?

1 Ответ

14 голосов
/ 30 сентября 2011

Обычно это называется структурной типизацией, а не утиной.Я отредактировал ваш заголовок.:)

Я думаю, что ваша проблема вызвана определением параметра типа 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.После замены этот пример точно такой же, как и выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...