0

私が取得したいのは、入力クラスのインスタンスを安全に返すことができるものです。私の場合、サービスプロバイダーとして使用されています。コードサンプル:

 public class MyClass {

    private Map<String, Object> mServices;

    public MyClass() {
        mServices = new HashMap<String, Object>();
        mServices.put(XmlService.class.getName(), new XmlService());
    }

    public <E extends Object> E getService(Class<?> service) {
        return (E) mServices.get(service.getName());
    }
}

私はパラメータ化されたタイプにそれほど熟練していないことを認めます、そして私はここでいくらかの助けを必要としています。マップからオブジェクトを取得していませんか?型安全性を失って、なぜEにキャストする必要があるのですか?警告のキャストや抑制を回避する方法はありますか?

4

2 に答える 2

1

いいえ、残念ながら、この余分なダウンキャストを回避する方法はありません。マップのタイプが。であることに注意してくださいMap<String, Object>Object-これが、Javaコンパイラが値について知っているすべてです。どういうわけか、すべてのキーのタイプが異なるようにマップを宣言する必要があります。不可能。

ただし、コードは少し単純化できます。

public <E> E getService(Class<E> service) {
    return (E) mServices.get(service.getName());
}

もう1つのわずかな改善にはClass、キーとしての使用が含まれます。

private Map<Class<?>, Object> mServices;

public <E> E getService(Class<E> service) {
    return (E) mServices.get(service);
}
于 2013-02-09T21:34:15.213 に答える
0

これはダウンキャストなしで機能するはずです:

public class ServiceLoader<T extends AbstractService> {

private Map<String, T> services = new HashMap<String, T>();

T getService(Class<T> componentType) {
    return services.get(componentType.getName());
}
于 2013-02-09T21:45:33.040 に答える