Код BigDecimal x = 1.0/30.0
скомпилирован компилятором Groovy и может там, конечно, легко испускать код, который будет вызывать во время выполнения. Если мы откажемся от кэширования callsite и всей логики вызова, то произойдет то, что вызывается NumberMath # getMath. Этот метод решает использовать типы операндов, какую математическую реализацию использовать. Затем информация об операции появляется позже как имя вызова метода с сайта вызова. Поскольку 1.0 и 30.0 являются BigDecimal в Groovy (суффикс D или d, чтобы сделать его двойным), BigDecimalMath # divideImpl будет использоваться в конце. Затем этот метод вызывает BigDecimal # divide. Поскольку для данного выражения требуется BigDecimal бесконечной длины, устанавливается масштаб и точность, которая является максимальным числом операндов и 10 и режимом округления по умолчанию. Что касается тех, кто выбирает типы ... это делается в классах реализации сайта вызова на основе реальных объектов, используя getClass(), иногда используется статическая информация, если предполагается, что время выполнения и статический тип являются некоторыми (подсказками: final classes).
Не уверен, что вы имеете в виду? –
@tim_yates Я имею в виду, как они учитываются? Добавлены ли они во время выполнения? – froi
Извините ... что добавлено в Runtime? –