Java 泛型和映射声明
Java Generics and Map declaration
我很难使用泛型声明 Map。我想声明一个具有以下属性的地图:
- 密钥是从特定接口 (IFoo) 派生的任何类型 T 的 Class 对象
- 这个Map的值是另一个Map,它的键是一个String,它的值是T类型
我以为我可以这样做:
public static Map<Class<T extends IFoo>, Map<String, T>> valueCache =
new HashMap<Class<T extends IFoo>, Map<String, T>>();
我在 "extends"
上收到语法错误
如果我像这样用通配符 (?) 替换 T 类型,它在语法上似乎是正确的:
public static Map<Class<? extends Typ>, Map<Integer, ?>> valueCache=
new HashMap<Class<? extends Typ>, Map<Integer, ?>>();
但我认为这不是我想要的,因为我希望 Class 对象的类型完全成为第二张地图中的值。
感谢任何帮助。
将扩展移至您的 class 的通用定义中:
public class ClassWithGeneric<T extends IFoo> {
Map<Class<T>, Map<String, T>> valueCache = new HashMap<Class<T>, Map<String, T>>();
}
既然你声明了一个地图,你应该指定所有类型它有很大帮助并且应该总是正确的所以它应该像 T 应该是一个类型而不是通用的因为你声明它所以 java 想知道java 的较新版本中的类型你不需要声明第二个 <> 泛型所以我不知道你的内部映射的第二种类型所以我使用了 Object
public static Map<IFoo,Map<String,Object>valueChache=new Hashmap<>();
两者都应该是正确的
public static Map<IFoo,Map<String,Object>valueChache=new Hashmap<IFoo,Map<String,Object>();
泛型类型参数只能在 class 或方法声明中声明。
如果您不关心返回的 IFoo
的引用类型,您可以这样做
static Map<Class<? extends IFoo>, Map<String, IFoo>> fooMap;
如果您想使用返回的 IFoo
作为其子 class 类型,那么您需要进行一些转换。
// abbreviated example
class FooMap {
private static Map<Class<? extends IFoo>, Map<String, IFoo>> map = ...;
static void put(String key, IFoo foo) {
map.get(foo.getClass()).put(key, foo);
}
static <F extends IFoo> F get(Class<F> cls, String key) {
return cls.cast(map.get(cls).get(key));
}
}
FooMap.put("foo", new Foo());
Foo foo = FooMap.get(Foo.class, "foo");
试试这个,
public static Map<IFoo, Map<String, IFoo>> valueCache = new HashMap<IFoo, Map<String, IFoo>>();
通过这种方式,您可以使用 IFoo Type 类 的地图。
技术上不可能做你想做的事,但你可以使用带有内部转换的访问器方法来模拟它。例如:
private static Map<Class<?>, Map<String, ?>> valueCache = new HashMap<>();
public <T extends IFoo> Map<String, T> getMap(Class<T> key) {
return (Map<String, T>)value cache.get(key);
}
我很难使用泛型声明 Map。我想声明一个具有以下属性的地图:
- 密钥是从特定接口 (IFoo) 派生的任何类型 T 的 Class 对象
- 这个Map的值是另一个Map,它的键是一个String,它的值是T类型
我以为我可以这样做:
public static Map<Class<T extends IFoo>, Map<String, T>> valueCache =
new HashMap<Class<T extends IFoo>, Map<String, T>>();
我在 "extends"
上收到语法错误如果我像这样用通配符 (?) 替换 T 类型,它在语法上似乎是正确的:
public static Map<Class<? extends Typ>, Map<Integer, ?>> valueCache=
new HashMap<Class<? extends Typ>, Map<Integer, ?>>();
但我认为这不是我想要的,因为我希望 Class 对象的类型完全成为第二张地图中的值。
感谢任何帮助。
将扩展移至您的 class 的通用定义中:
public class ClassWithGeneric<T extends IFoo> {
Map<Class<T>, Map<String, T>> valueCache = new HashMap<Class<T>, Map<String, T>>();
}
既然你声明了一个地图,你应该指定所有类型它有很大帮助并且应该总是正确的所以它应该像 T 应该是一个类型而不是通用的因为你声明它所以 java 想知道java 的较新版本中的类型你不需要声明第二个 <> 泛型所以我不知道你的内部映射的第二种类型所以我使用了 Object
public static Map<IFoo,Map<String,Object>valueChache=new Hashmap<>();
两者都应该是正确的
public static Map<IFoo,Map<String,Object>valueChache=new Hashmap<IFoo,Map<String,Object>();
泛型类型参数只能在 class 或方法声明中声明。
如果您不关心返回的 IFoo
的引用类型,您可以这样做
static Map<Class<? extends IFoo>, Map<String, IFoo>> fooMap;
如果您想使用返回的 IFoo
作为其子 class 类型,那么您需要进行一些转换。
// abbreviated example
class FooMap {
private static Map<Class<? extends IFoo>, Map<String, IFoo>> map = ...;
static void put(String key, IFoo foo) {
map.get(foo.getClass()).put(key, foo);
}
static <F extends IFoo> F get(Class<F> cls, String key) {
return cls.cast(map.get(cls).get(key));
}
}
FooMap.put("foo", new Foo());
Foo foo = FooMap.get(Foo.class, "foo");
试试这个,
public static Map<IFoo, Map<String, IFoo>> valueCache = new HashMap<IFoo, Map<String, IFoo>>();
通过这种方式,您可以使用 IFoo Type 类 的地图。
技术上不可能做你想做的事,但你可以使用带有内部转换的访问器方法来模拟它。例如:
private static Map<Class<?>, Map<String, ?>> valueCache = new HashMap<>();
public <T extends IFoo> Map<String, T> getMap(Class<T> key) {
return (Map<String, T>)value cache.get(key);
}