クロージャのマップを使用してGroovyでインタフェースを実装する場合(http://groovy.codehaus.org/Groovy+way+to+implement+interfacesなど)、asキーワードまたはasTypeを使用した後にオブジェクトをマップに戻す方法はありませんインターフェイスを実装する方法は?インタフェースを実装するGroovyマップをマップに変換する
答えて
あなたのユースケースに基づいて、必要なインターフェイスに変換する前に元のMap
への参照を保持できるように思えます。あなただけInvocationHandler
のデリゲートを取得することにより、元のマップを再取得することができますように
しかし、(Proxy
を使用して)インタフェースにMap
オブジェクトを変換し、ソースコードを見て、それが見えます。
def i = 1
def m = [ hasNext:{ true }, next:{ i++ } ]
Iterator iter = m as Iterator
def d = java.lang.reflect.Proxy.getInvocationHandler(iter).delegate
assert d.is(m)
注:私はJavaコードのユニットテストを書くためのGroovyの多くを使用し
興味深い質問...短い答え、いいえ。長い答え、多分...あなたはこのような何かを持っていると仮定すると:
:def i = 1
Iterator iter = [ hasNext:{ true }, next:{ i++ } ] as Iterator
は、[今すぐ、あなたがこれを行うためのメソッドを宣言することができ
println iter.take(3).collect()
プリント[1,2,3]
を呼び出します
def mapFromInterface(Object o, Class... clz) {
// Get a Set of all methods across the array of classes clz
Set methods = clz*.methods.flatten()
// Then, for each of these
methods.collectEntries {
// create a map entry with the name of the method as the key
// and a closure which invokes the method as a value
[ (it.name): { Object... args ->
o.metaClass.pickMethod(it.name, it.parameterTypes).invoke(o, args)
} ]
}
}
これで、次の操作を実行できます。
def map = mapFromInterface(iter, Iterator)
、呼び出し:
println map.next()
println map.next()
はprintln map
で地図を印刷5
続い4
を出力しますが得られます。しかし
[ remove:[email protected],
hasNext:[email protected],
next:[email protected] ]
、これはマップであるとして、 thを持つ複数のメソッドを含むクラス同じ名前と異なる引数は失敗します。私はまた、最初のケースでこれを行うことがどれほど賢明であるかもわかりません...
あなたのユースケースはどのようなものですか?
と頻繁に迅速としてクロージャのマップを使用します。これは、Groovyのコードの内部に依存ので、ご自身の責任で使用します私のユニットが依存しているインターフェースをスタブアウトするための汚い方法です(私が実際にインタラクションを検証することを気にしないときは、ほとんどのモックライブラリよりも簡単です)。時には私は "プロトタイプ"のスタッブされたインターフェイスを設定したいだけで、テストシナリオごとにちょっと微調整したいのですが、マップに戻すことができないとできません。 –
@WillGormanあなたのユースケースについては、[plecongの答え](http://stackoverflow.com/a/9507914/6509)はおそらく私のものよりも良くて清潔です:-) –
- 1. groovyのマップの値を変換する
- 2. groovy文字列をgroovyのマップに変換する
- 3. JavaマップをJavascriptマップに変換する
- 4. groovyをグループを使ってマップに変換する最大値
- 5. Jenkinsパイプラインgroovyのマップの値を変換する
- 6. Groovy-JSONSlurper:JSONマップをキー=値のペアに変換します。
- 7. JavaマップをJavaコードのScala不変マップに変換する
- 8. JAXB - サードパーティのライブラリの実装にマップするJavaインタフェースのWebサービスのコンテキストで
- 9. QlikView 11でGoogleマップを実装する
- 10. Javaでマップを実装する
- 11. マップのベクトルをC++で実装する
- 12. マップを同じマップの値のリストに変換する
- 13. ルビーハッシュをC++マップに変換する
- 14. 単独リンクリストをマップに変換する
- 15. 座標をGoogleマップに変換する
- 16. int streamをマップに変換する
- 17. .JSONリストをgoogleマップに変換する
- 18. Scalaのマップをjavaに変換する
- 19. セットをマップに変換する方法
- 20. Scala - RDDをマップに変換する
- 21. マップをjsonオブジェクトに変換する
- 22. マップをタプルに変換する
- 23. Golang:スライスをマップに変換する
- 24. マップをアンドロイドのバンドルに変換する
- 25. エリクサー - マップにリストを変換する
- 26. リスト/マップをorg.apache.flink.util.Collectorに変換する
- 27. ダイナミックjsonをマップに変換するジャック
- 28. Googleマップの実装
- 29. Groovyでマップを定義する方法
- 30. Java 8ストリームでImmutablePairを使用するマップにマップのリストを変換する
+1鮮やかな:-)私は考えなかったそれ! –