Неявное преобразование из любого в динамический - PullRequest
8 голосов
/ 15 мая 2011

Почему не работает следующее?(Да, я работаю с 2.9.0финал и включил опцию " -Xexperimental ".)

implicit def any2Dynamic(a: Any) = new Dynamic {
  def applyDynamic(name: String)(args: Any*) = {
    println(a + name)
  }
}

"Say".hello // value hello is not a member of java.lang.String

Можно поспорить о том, насколько это значимо... Если это сработает, как ожидается, какой приоритет будет иметь место в "Say".toInt: StringLike.toInt или (new Dynamic {...}).applyDynamic("toInt")?

1 Ответ

9 голосов
/ 15 мая 2011

Сначала компилятор ищет неявное представление из String => { def hello: ? }. Это терпит неудачу, поэтому проверяет , если String <: Dynamic. Они не объединены.

Эта функция динамического применения не была завершена - в Scala 2.9.0 она является экспериментальной и может быть изменена. Но я сомневаюсь, что это будет включено, поскольку с таким неявным, вы выбрасываете все типы безопасности в окно. Вы никогда не получите ошибку компиляции для имен методов с ошибками или неправильных типов аргументов. Какой у вас вариант использования?

...