Groovy мульти-методы - PullRequest
       20

Groovy мульти-методы

0 голосов
/ 09 января 2020

Я начал изучать Groovy и мне стало любопытно, как разрешается вызов метода. Я прочитал и понял, что такое groovy мульти-методы, но я не могу понять поведение следующего фрагмента кода

def method(int i) {
    println 1
}

def method(Number n) {
    println 2
}

Number n = 1

method n            # returns 1 as expected
method((Number) n)  # returns 2 which I can't understand why

Есть ли какие-то исключения относительно приведения? Может кто-нибудь объяснить, пожалуйста, это поведение?

1 Ответ

0 голосов
/ 09 января 2020

Я думаю, что вы видите здесь, является результатом ввода / вывода стоимости.

Если вы передаете значение типа actial Integer in, оно преобразуется в int во время поиска метода и вызывается 1-й метод.

Если вы приводите значение к Number или его подкласс явно, входящие сообщения не происходят, и вызывается метод, ожидающий Number.

Я немного расширил ваш код:

def method(int i) {
    println "int > $i / ${i.getClass()}"
}

def method(Number i) {
    println "Number > $i / ${i.getClass()}"
}

def method(float i) {
    println "float > $i / ${i.getClass()}"
}

Number n = 1
Number nFloat = 1.0f
Number nDouble = 1.0d

method n
method( new BigInteger( n ) )
method( (Number)n )
method( new BigInteger( n ) as int )
method nFloat
method nDouble

отпечатки

int > 1 / class java.lang.Integer
Number > 1 / class java.math.BigInteger
Number > 1 / class java.lang.Integer
int > 1 / class java.lang.Integer
float > 1.0 / class java.lang.Float
Number > 1.0 / class java.lang.Double

Надеюсь, теперь все становится яснее ...

...