Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建泛型映射以保存使用相同参数类型的类型的键和值_Java_Generics - Fatal编程技术网

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实例。我不确定如何实现此目标。解决方法:使用方法并运行规则,而不是直接将对象放入地图中