Следующее уже не является строго верным с чертой Dynamic
, обнаруженной в [экспериментальной] Scala 2.9.См., Например, ответ Киптона Барроса.
Тем не менее, Dynamic
по-прежнему не совсем , как method_missing
, но использует магию компилятора, чтобы эффективно переписывать вызовы методов как «пропавшие»методы, определенные статически, для прокси (applyDynamic
).Это подход статического определения «отсутствующих» методов, который отличает его от method_missing
с точки зрения полиморфизма: нужно было бы попробовать и динамически перевести (например, с отражением) методы, чтобы получить истину method_missing
поведение.(Конечно, этого можно избежать, избегая подтипов: -)
Нет.Такой концепции не существует в Java или Scala.
Как и в Java, все методы в Scala «связаны» во время компиляции (это также определяет, какой метод используется для перегрузки и т. Д.).Если программа выполняет компиляцию, указанный метод существует (или сделал в соответствии с компилятором), в противном случае это не так.Вот почему вы можете получить NoSuchMethodError , если вы измените определение класса, не перестраивая все затронутые классы.
Если вы просто беспокоитесь о попытке вызвать метод объекта, который соответствуетподпись («типизированная утка»), тогда, возможно, вам удастся уйти с помощью структурного набора .Структурная типизация в Scala - это волшебный доступ к отражению - таким образом, он откладывает «привязку» до времени выполнения и может возникнуть ошибка времени выполнения.В отличие от method_missing это не позволяет target обработать ошибку, но позволяет вызывающей стороне (и вызывающий может теоретически вызвать определенный метод methodMissing для цели ... но это, вероятно, не лучшийспособ подойти к Scala. Scala - это не Ruby: -)