J2SE 1.4 で書いたやりたいこと
Class fooClass = Class.forName("Foo");
Foo fooObject = (Foo)fooClass.newInstance();
これを generics を使ってスマートに書きたい.
案1
Class<Foo> fooClass = (Class<Foo>)Class.forName("Foo");
Foo fooObject = fooClass.newInstance();
キャストが入っている時点で generics をスマートに使っていない.
案2
Class<?> fooClass = Class.forName("Foo");
Foo fooObject = fooClass.newInstance();
コンパイルエラー.? と Foo は互換じゃない.
で煮詰まって検索してみたところ,こう書くことができるようだ.
Class<?> clazz = Class.forName("Foo");
Class<? extends Foo> fooClass = clazz.asSubclass(Foo.class);
Foo fooObject = fooClass.newInstance();
他にも,こんな書き方も可能なようだ.
Class<?> clazz = Class.forName("Foo");
Class<? extends Foo> fooClass = clazz.asSubclass(Foo.class);
Foo fooObject = fooClass.cast(clazz.newInstance());