外部から提供されたクラス名を受け取るコードがいくつかあり、インターフェイスを実装するインスタンスを構築する必要がありますFoo
。
このプロセスの一環として、次の機能が必要です。
private static Class<? extends Foo> fooFromClassName(String name) throws ClassNotFoundException {
return (Class<? extends Foo>) Class.forName(name);
}
これは明らかに未チェックの警告になります。これは本当に安全ではないためです。呼び出し元が "java.lang.Long" を要求した可能性があります。私は最終的に、このメソッドがスローしない場合、返されたものが実装Class
を表すことを保証することを望んでいます。Foo
私の現在の最善の解決策はこれです:
private static Class<? extends Foo> fooFromClassName(String name) throws ClassNotFoundException {
Class<?> impl = Class.forName(name);
if (Foo.class.isAssignableFrom(impl)) {
@SuppressWarnings("unchecked")
Class<? extends Foo> foo = (Class<? extends Foo>) impl;
return foo;
} else {
// Throw something - ClassCastException perhaps.
}
}
これを行うより良い方法はありますか?警告を明示的に抑制する必要のない方法はありますか?