白魔術師
スニペットが評判悪すぎですよ。
スニペットに走る前に、HackパラメータのDOMジェネリックス型にextendsとsuperとの型引数動作をきちんと実装したほうがいいな。
-黒魔術 - まさたか日記
いえす。ただしパラメータドライブ+ジェネリックスでは、微妙にあいまいさがあるコードを書けるのでそこらへんを注意しないとまずいかもしれません。
下のようなパラメータにドライブするとき、
- void driven(CtNewInstance)
- void driven(CtNewInstance< ? >)
- void driven(CtNewInstance< AbstractList >)
- void driven(CtNewInstance< AbstractList< ? > >)
- void driven(CtNewInstance< AbstractList< DataInputStream > >)
- void driven(CtNewInstance< AbstractList< ? extends DataInputStream > >)
- void driven(CtNewInstance< AbstractList< ? super DataInputStream > >)
- void driven(CtNewInstance< ? extends AbstractList >)
- void driven(CtNewInstance< ? extends AbstractList< ? > >)
- void driven(CtNewInstance< ? extends AbstractList< DataInputStream > >)
- void driven(CtNewInstance< ? extends AbstractList< ? extends DataInputStream > >)
- void driven(CtNewInstance< ? extends AbstractList< ? super DataInputStream > >)
- void driven(CtNewInstance< ? super AbstractList >)
- void driven(CtNewInstance< ? super AbstractList< ? > >)
- void driven(CtNewInstance< ? super AbstractList< DataInputStream > >)
- void driven(CtNewInstance< ? super AbstractList< ? extends DataInputStream > >)
- void driven(CtNewInstance< ? super AbstractList< ? super DataInputStream > >)
抽象クラスもnewできると仮定したとして、どれがどれにマッチするのかを決めないと怪しげになりそうです。
- new Object()
- new AbstractCollection()
- new AbstractCollection
() - new AbstractCollection
() - new AbstractCollection
() - new AbstractList()
- new AbstractList
() - new AbstractList
() - new AbstractList
() - new ArrayList()
- new ArrayList
() - new ArrayList
() - new ArrayList
()
イメージとしては、単純に「ドライブ可能かどうか」っていう判定でもいいかなと思います。
ただし、コンストラクタ起動時には new ArrayList< ? > のようにワイルドカードを指定できませんが、変数の宣言などでは普通に ArrayList< ? > list = ... のようにワイルドカードを使えてしまい、「ArrayList< ? >」という型そのものをあらわすクエリが書きにくくなる可能性はあります。
ともあれ、23時までに↓のクエリが動いたので今日は満足です。
/** * @when * {@link Deprecated} in target.annotations.spec */
これなら白魔術ですよね?
「Deprecated型が対象(target)の注釈一覧(.annotation)の仕様(.spec)に含まれる」と読めなくもないですし。ただ、.specってのはいまさらながらわかりにくいかも…