7

外部から提供されたクラス名を受け取るコードがいくつかあり、インターフェイスを実装するインスタンスを構築する必要があります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.
    }
}

これを行うより良い方法はありますか?警告を明示的に抑制する必要のない方法はありますか?

4

1 に答える 1

6

Class.asSubclass:

private static Class<? extends Foo> fooFromClassName(String name) throws ... {
    return Class.forName(name).asSubclass(Foo.class);
}

Foo要求されたクラスが(またはFooそれ自体の)サブクラスでない場合は、 ClassCastException. つまり、ソリューションが行うこととほぼ同じことを行います。

于 2012-09-21T07:38:54.537 に答える