Это совершенно не связано. Неявные значения в scala полностью разрешаются во время компиляции. Компилятор вставляет то, что вы могли бы написать сами. Если он не может этого сделать, во время компиляции возникает ошибка. InvokeDynamic — это поиск метода во время выполнения и сбой во время выполнения, если он не может быть найден.
В частности, если вы напишете в scala x.m()
, где нет метода m типа x, он будет искать неявное преобразование, то есть функцию, скажем, f, которая находится в области видимости (в этот момент вы можете вызвать f), которая помечен как implicit, который будет принимать x в качестве параметра, и чей тип результата имеет метод m
(в правилах намного больше подробностей, но это суть). Если он найдет такой метод, то заменит x.m()
на правильно типизированный f(x).m()
. С таким же успехом это могло быть написано в коде, и это должно было бы быть в java. Если такая функция f не может быть найдена, возникает ошибка времени компиляции.
Это происходит точно так же, если вы вызываете g(x)
, а x
имеет неправильный тип для передачи в g
. Если существует функция f
такая, что f(x)
имеет правильный тип, то она заменит код на g(f(x))
. Опять же, вы могли бы написать это сами на простой scala, и опять же, если такого метода нет, он не скомпилируется.
Dynamic заключается в том, чтобы не слишком беспокоиться во время компиляции о том, есть ли метод m
в x
, и искать его во время выполнения. Так обычно работает динамический язык, такой как JRuby или Groovy. Есть что-то родственное в scala, черта Dynamic (помечена как экспериментальная).
person
Didier Dupont
schedule
20.08.2011