4

私はプライベートインスタンスを持っています

private final Map<Class<?>, ?> map;

構文的には、これは正しいです。やりたいことはこれです。

public class User {
}
public class UserSubclass extends User {
}
public class Role {
}

map.put(User.class, new User()); // valid
map.put(User.class, new UserSubclass()); // valid
map.put(Role.class, new Role()); // valid
// But when I do the following I need to get an error
map.put(User.class, new Role(); // invalid, compiler error
  1. マップはどのように宣言すればよいですか?
  2. HashMap のオブジェクトをこの Map にインスタンス化するにはどうすればよいですか?
4

2 に答える 2

5

いいえ、シンプルjava.util.Mapはこれをサポートしていません。それは静的に型付けされており、基本的には、別のパラメーターのランタイム型に基づいた 1 つのパラメーターの動的型付けです。

ただし、GuavaクラスClassToInstanceMapはまさにあなたが望むものを実装しています:

マップ。各エントリが Java の生の型をその型のインスタンスにマップします。の実装Mapに加えて、追加の型安全な操作putInstance(java.lang.Class<T>, T)getInstance(java.lang.Class<T>)が利用可能です。

于 2013-04-16T13:08:35.063 に答える
4

デフォルトではこれを行うことはできませんが、できることは、機能する独自の汎用セーフ マップを作成することです。

GenericMap は次のようになります。

class GenericMap extends HashMap<Class<?>, Object> {

    public <T> T putClassAndInstance(Class<T> c, T o){
        return c.cast(super.put(c, o));
    }

    public <T> T getInstance(Class<T> c) {
        return c.cast(super.get(c));
    }
}

そして、次のように使用できます。

GenericMap map = new GenericMap();

map.putClassAndInstance(User.class, new User()); // valid
map.putClassAndInstance(User.class, new UserSubclass()); // valid
map.putClassAndInstance(Role.class, new Role()); // valid
map.putClassAndInstance(User.class, new Role()); // invalid, compiler error

このように、ユーザーとロール用の特別なメソッドを作成する必要はありませんが、間違ったタイプの間違ったオブジェクトを追加しないという安全性が確保されています。

于 2013-04-16T13:22:23.827 に答える