追記:
はてぶのterazzoさんのコメントにあるように、単に
public <S, T extends S> void assertEq(S a, T b){ }
でいい気がする・・・orz
はじめに、scalaz の assert_=== って書きましたが、Equal のインスタンスを要求しないので、かなり別のものです、すいません。(いい題が思いつかなかったので)
目的としては、この assertEquals
で、一つ目の引数と2つ目の引数の型が違ったらコンパイル時にエラーにしたいって話です。
それぞれ、プリミティブ型と、メッセージ書けるように引数3つのものがありますが、あとは (Object,Object) 型のものしかなくて、ジェネリクスなものがありません。
最初こんな感じにやりましたが
これだと結局、1つめと2つめの引数の共通の親の型に推論されちゃって(たとえば一つ目の引数にintわたして、2つめにString渡してもObject型)コンパイルエラーになりません。
ってことで、 functionalJava 使って、こうなりました↓
使用例↓
こんな感じでコンパイル時エラーになる↓
つまりカリー化しておけば、最初の引数渡した時点でその型に推論されるっていうだけの話です。
もし
- もっと簡単に書けるよ! とか
- さらに工夫して、こうしたほうがいいよ!とか
- すでに同じようなライブラリあるよ! とか
- それ◯◯さんが、以前書いてるよ!
とかあったら教えてください・・・。そもそもこんなことをする必要あるのか?っていう疑問はありますが・・・