Java 创建泛型映射以保存使用相同参数类型的类型的键和值
我有一个由两个类实现的接口Java 创建泛型映射以保存使用相同参数类型的类型的键和值,java,generics,Java,Generics,我有一个由两个类实现的接口 interface I {} class A implements I {} class B implements I {} 现在,我想创建一个映射,它可以将key作为任何对象的类,用I实现,并将value作为该类的对象。这样我就可以做到: map.put(A.class, new A()); map.put(B.class, new B()); 以下所有情况都应给出错误: map.put(A.class, new B()); map.put(I.class, n
interface I {}
class A implements I {}
class B implements I {}
现在,我想创建一个映射,它可以将key作为任何对象的类,用I
实现,并将value作为该类的对象。这样我就可以做到:
map.put(A.class, new A());
map.put(B.class, new B());
以下所有情况都应给出错误:
map.put(A.class, new B());
map.put(I.class, new B());
以下Map
以这种方式无效:
Map<Class<? extends I>, ? extends I> map;
Map怎么办
interface I {
}
class A implements I {
}
class B implements I {
}
public class Example {
public static <T extends I, M extends Map<Class<T>, T>> void put(M map, Class<T> key, T value) {
map.put(key, value);
}
public static void main(String[] args) {
Map map = new HashMap<Class<I>, I>();
put(map, A.class, new A());
put(map, A.class, new B()); // error
put(map, B.class, new A()); // error
put(map, B.class, new B());
}
}
这是因为无法使用Map
界面将V
指定为依赖于K
。您必须为客户端提供一个有运行时错误并实现Map的类,或者提供一个有编译时错误但没有实现Map的类。
interface I {
}
class A implements I {
}
class B implements I {
}
public class Example {
public static <T extends I, M extends Map<Class<T>, T>> void put(M map, Class<T> key, T value) {
map.put(key, value);
}
public static void main(String[] args) {
Map map = new HashMap<Class<I>, I>();
put(map, A.class, new A());
put(map, A.class, new B()); // error
put(map, B.class, new A()); // error
put(map, B.class, new B());
}
}
这是因为无法使用Map
界面将V
指定为依赖于K
。您必须为客户端提供一个有运行时错误并实现Map的类,或者提供一个有编译时错误但没有实现Map的类。这段代码解决了您的问题吗
import java.util.*;
public class Test {
Map< Class<? extends I>, I> map = new HashMap < Class<? extends I>, I>();
public static void main(String args[]){
Test t = new Test();
t.addMaps();
}
private void addMap(I obj){
map.put(obj.getClass(),obj);
}
private void addMaps(){
addMap(new A());
addMap(new B());
System.out.println(map);
}
}
interface I {}
class A implements I {}
class B implements I {}
class C{};
import java.util.*;
公开课考试{
Map
import java.util.*;
public class Test {
Map< Class<? extends I>, I> map = new HashMap < Class<? extends I>, I>();
public static void main(String args[]){
Test t = new Test();
t.addMaps();
}
private void addMap(I obj){
map.put(obj.getClass(),obj);
}
private void addMaps(){
addMap(new A());
addMap(new B());
System.out.println(map);
}
}
interface I {}
class A implements I {}
class B implements I {}
class C{};
import java.util.*;
公开课考试{
Guava中的MapGuava中的Map相关问题:相关问题:但重点是我不应该能够在Map中插入任何具有不同类键的值。Map不应该允许这样做。我告诉Map@afzalex看编辑,我相信这就是你想要的,请试着理解。map仍然可以将A.class作为键保存,而新的B()作为值。因此,如果我将此映射提供给任何人。我不能确定他是否会插入相应的ClassI实例。我不确定如何实现这一点。解决方法:使用方法并运行规则,而不是直接将对象放入映射中,但重点是我不应该在映射中插入任何具有不同类的键的值。Map不应该允许。我告诉过Map@afzalex查看编辑。我相信这符合您的要求。请尝试理解。map仍然能够将A.class作为键和新的B()作为值。因此,如果我将此地图提供给任何人。我无法确定他是否会插入相应的ClassI实例。我不确定如何实现此目标。解决方法:使用方法并运行规则,而不是直接将对象放入地图中