きどたかのブログ

いつか誰かがこのブログからトラブルを解決しますように。

知らなかった・・・、インナークラスってそういうものなんだ。

コンストラクターインジェクションでこけた。


どうもインナークラスを生成したかったらしい。
なんかクラスを起こすのが面倒だったのでインナークラスを書いて、
インジェクションの設定をしたらしいのだが・・・。


getConstructors()で出力してみたら、コンストラクタ引数にアウタークラスを取るらしい。
へぇ〜知らなかった。
アウタークラスではなく、正しくはEnclosingClassかな。
static classでネストクラスを作ったなら普通のコンストラクタだ。
ついでにメソッド内でクラスを書いた場合のも見たが、コンストラクタは存在するも引数がよく分からない。
無名インナーはコンストラクタは取れず。



あとは、知識としては知ってたけど実際には試したことがなかったことを試してみた。
long val = (long)Integer.MIN_VALUE - 1; //int範囲に収まらないマイナス値を作る
int i = (int)val;
ここで作られるiは正の値になってしまうというやつ。
キャスト出来るからと言ってキャストして良いわけじゃない。
確か理屈ではlonは符号付き8バイトで、それを符号付き4バイトにする際、頭4バイトを削られる。
つまりは符号部1ビットも消し飛ぶ。
これがナロー変換ってやつ。
逆のもあって、ワイドニング変換なんだが、インジェクションの時に気にする。
型が合うかはワイドニング変換も考慮して書く。


int.classはInteger.TYPEと同じだが、
Integer.classといくらisAsignableFromしてもtrueにはならんかったはず。
参照型のナロー・ワイドニング変換には使えないという認識。


Java歴は3年と3ヶ月くらいになった。
そこそこ詳しいと言えるようになってるはず。


知ってるからどうしたという話もあるが、
DIコンテナを作る人は知ってないと話にならないはず。




さてと、インナークラスもインスタンス化してあげるべきなのかな??