2016-12-30 4 views
0

Я раньше работал с некоторыми SQL, и мне стало интересно, какая разница между этими двумя типом.В чем разница между T и def в groovy?

В моем примере у меня есть 2 GroovyRowResults - pastData и currentData. Теперь мне нужно сравнить 2 балла из этих наборов результатов. Эти значения должны иметь неопределенный тип. Таким образом, при определении их, в чем разница между

def pastResult = pastData[commonKey] 
def currentResult = currentData[commonKey] 

if(pastResult == currentResult){ 
    doSomething() 
} 

и

T pastResult = pastData[commonKey] 
T currentResult = currentData[commonKey] 

if(pastResult == currentResult){ 
    doSomething() 
} 

ответ

1

Я предполагаю, что T был объявлен в вашем методе/классе ранее. В этом случае это generic, а T относится к тому же типу объекта последовательно, тогда как def в основном является просто псевдонимом для Object.

T не гарантирует, что два объекта являются одним и тем же классом (они могут просто реализовать один и тот же интерфейс или быть подклассом), он создает больше контракта в объектах, с которыми вы имеете дело. Если вы передадите те же типы объектов в метод, то не будет никакой разницы, но если вы передаете разные или неожиданные типы, это будет более полезно.

Другими словами, в Groovy это делается для удобства чтения и согласованности, а использование дженериков намного лучше, чем использование динамической типизации.

+0

Спасибо, Игорь! Я чувствую, что видел тебя вокруг кучки в течение долгого времени, скрываясь. Я знаю, что groovy - динамический язык, поэтому мне не нужно бросать что-то после использования def для его создания. Означает ли это, что различия между Object и T немного менее значительны, чем def и T? – Zyxer22

+0

@ Zyxer22 Да, не проблема. Что касается различий ... Я не думаю, что есть много тех пор, пока вы не меняете тип после инициализации объекта. 'def' в основном пригодится, когда вы переходите из списка в массив в связанный список и т. д. (тогда как Object не позволяет вам это делать). Но для ваших целей я считаю, что 'def' vs' Object' (и на практике, даже 'T') одинаковы. – Igor

0

Я не думаю, что второй пример будет работать, если не будет какой-то объект под названием T. Проверить эту ссылку http://groovy-lang.org/semantics.html#_variable_definition

+0

Groovy использует библиотеки java, поэтому он должен работать, но я проверял его, чтобы быть уверенным. импорта java.lang.invoke.MethodHandleImpl.BindCaller.T общественного Foo() { Т = 5 бар Т bar2 = 4 бар == bar2 } – Zyxer22

+0

Комментарий форматирования не работает, и, видимо, не могу Эдир , Я только что импортировал java-библиотеку bindcaller.T и сделал общедоступную функцию void foo() , которая использовала эти значения выше. – Zyxer22

Смежные вопросы