ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

getClass()の不思議

2008-08-10 19:56:19 | PG(Java)

Object#getClass()の戻り値を変数に入れる際、変数の型は何にすればいいか?

「Type obj」に対して「Class c = obj.getClass()」でいけるんだけど、JDK1.5以上ならジェネリクスの型情報が無いのは寂しい。
でも「Class<Type> c = obj.getClass()」はダメなんだよね。
「Class<Type> c = (Class<Type>)obj.getClass()」という風にキャストしてやれば動作はするが、コンパイル時に警告が出る。
で、正解は「Class<? extends Type> c = obj.getClass()」。
これで「Type t = c.newInstance()」という書き方も問題なく出来る。
(Typeにデフォルトコンストラクターが無いと実行時に例外発生となるが、それはまた別のお話

で問題は、Object#getClass()の定義
JRE1.5と1.6で異なっているけれども、いずれにしてもそれと同じ定義を自分で行った場合、上記の“正解”のようなコーディングは出来ない。
うーん、RuntimeExceptionと同じような、言語仕様上の特別扱いなんだろうか。
(RuntimeExceptionの派生クラスは、throwsに書くのを省略できる)


演算子の暗黙の仕様

2008-08-10 01:36:14 | PG(Java)

Javaの雑多なことを書いていたページから、演算子に関するものを新設した演算子ページに移動。

もともとちょっと注意の要りそうな演算子(だから4つくらいだけ)をメモしてただけなので、単純に移しただけなら相当寂しいページになってたと思うんだけど…。

この際だから優先順位に基づく一覧表を作ろうと思ってJava言語仕様を見たのが運の尽き(爆)
意外と知らない(かつ、知ってたけどはっきりとは意識していなかった)仕様が色々あるのを知って愕然。
(フィールドもキャストによって親クラスを指定できたのか…!)

オブジェクト指向とかに関わらない、基礎的な演算子の部分ですら、これだけ複雑な仕様があったとは…。(演算子の解釈が曖昧にならないようにする為にJavaの他の文法と密接に絡んでいる箇所もあるみたいだけど)
コンピューター言語を作るのなんて、夢のまた夢だな^^;