2016-12-30 9 views
0

私はいくつかのSQLを以前に使っていたので、これらの2つのタイプの違いが何であるか不思議でした。groovyのTとdefの違いは何ですか?

私の例では、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は、2つのオブジェクトがまったく同じクラス(同じインターフェイスを実装するだけでもサブクラスかもしれません)を保証するものではなく、扱っているオブジェクトでより多くのコントラクトを作成します。同じタイプのオブジェクトをメソッドに渡すと、違いはありませんが、異なるタイプまたは予期しないタイプを渡すと、より便利になります。

つまり、Groovyでは可読性と一貫性のために行われており、ジェネリックを使用する方が動的型定義を使用する方がはるかに優れています。

+0

ありがとうございました!私はあなたが私の長い時間の束の周りに潜んでいるのを見たように感じる。私はgroovyが動的な言語であることを知っています。だから、defを使ってそれを作成した後に何かをキャストする必要はありません。これにより、ObjectとTの違いはdefとTよりも少し重要になりますか? – Zyxer22

+0

@ Zyxer22はい、問題ありません。違いについては...私はあなたがオブジェクトを初期化した後に型を変更していない限り、多くはないと思います。 'def'は、リストから配列への変換時に、ほとんどの場合便利です(Objectはあなたにそれをさせません)。しかし、あなたの目的のために、私は 'def'と' Object'(そして実際には、 'T')も同じだと思います。 – Igor

0

の違いは何でしょう、私は第二の例がうまくいくとは思わないT.このリンク http://groovy-lang.org/semantics.html#_variable_definitionを確認してくださいと呼ばれます

+0

GroovyはJavaライブラリを使用しているので動作するはずですが、確かにテストしました。 インポートjava.lang.invoke.MethodHandleImpl.BindCaller.T公共のfoo() – Zyxer22

+0

フォーマットコメントが機能しなかったと明らかに私はEDIRできない{== BAR2 Tバー= 5 T BAR2 = 4 バー} 。私はちょうどbindcaller.TのJavaライブラリをインポートして公開しました上記の値を使用するvoid foo()関数。 – Zyxer22

関連する問題