14

引数の型に関するクロージャーについて、より明確にしたいと思います。だから私は次のようなものを書くでしょう

List<Y> myCollect(List<X> list, Closure<X,Y> clos) { ... }

Groovy がその型情報を使用しないことはわかっていますが、Groovy++ はコンパイル時にそれを使用する可能性があります。これを達成できますか(コメントに入れる以外に)?

更新: タイトルは誤解を招くように聞こえるかもしれませんが、上記の例でより明確になると思いました。関数の引数であるクロージャの型を指定することに興味があります。組み込みの を再定義したいとしcollectます。だから私は書くことmyCollectではなく、書くことに興味がありclosます。私が達成したいのは、コンパイル時エラーを取得することです

myCollect(['a', 'ab'], { it / 2 }) // compile error
myCollect(['a', 'ab'], { it.size() })  // OK 
4

3 に答える 3

10

クロージャーのパラメーターの型を定義できますが、上記の構文は正しくありません。パラメータ型のないクロージャは次のとおりです。

def concatenate = {arg1, arg2 ->
  return arg1 + arg2
}

そして、これはパラメーター型を持つ同じクロージャーです

def concatenate = {String arg1, String arg2 ->
  return arg1 + arg2
}

Groovy がその型情報を使用しないことはわかっていますが、Groovy++ はコンパイル時にそれを使用する可能性があります。

Groovy はコンパイル時の型チェックを行いますが、Groovy++ (または Java) ほどではありません。型情報がコンパイル時に使用されなくても、実行時にチェックされ、ドキュメントの形式としても価値があります。

于 2011-04-18T09:21:18.323 に答える