Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.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 - Fatal编程技术网

Java 如何使两个子类成为键类型为父类的映射中的键

Java 如何使两个子类成为键类型为父类的映射中的键,java,Java,所以,我有一张地图 Map<Class<? extends ISwarmEntity>, Object> map = new hashmap; Swarmmob1将被swarmmob2 伙计们,这很有效。对不起 重写不同类的hashcode和equals方法,这些类扩展了ISwarmEntity,以便将它们用作HashMap中的键 但这是一个非常糟糕的主意,总是使用不可变对象作为HashMap的键。 为了防止对用于计算hashCode()的字段进行更改,需要具有不可变

所以,我有一张地图

Map<Class<? extends ISwarmEntity>, Object>  map = new hashmap;
Swarmmob1
将被
swarmmob2


伙计们,这很有效。对不起

重写不同类的hashcode和equals方法,这些类扩展了ISwarmEntity,以便将它们用作HashMap中的键

但这是一个非常糟糕的主意,总是使用不可变对象作为HashMap的键。 为了防止对用于计算hashCode()的字段进行更改,需要具有不可变性,因为如果键对象在插入和检索期间返回不同的hashCode,则无法从HashMap获取对象

你所做的是

static class BaseClass { }

static class ClassA extends BaseClass { }

static class ClassB extends BaseClass { }

@Test
public void yourCase() throws Exception {
    Map<Class<? extends BaseClass>, Object> map = new HashMap<>();

    ClassA x = new ClassA();
    ClassA y = new ClassA();

    map.put(x.getClass(), 1);
    map.put(y.getClass(), 2);

    assertEquals(1, map.get(ClassA.class)); // fails, x and y have same class
}
静态类基类{}
静态类ClassA扩展基类{}
静态类ClassB扩展基类{}
@试验
public void yourCase()引发异常{

Map为什么你认为它不起作用? 您是否可能犯了不同的错误,但泛型让您感到困惑

import java.util.*;

class MapExtend {

    public static void main (String[] a) {
        Map<Class<? extends I>,Integer> map = new HashMap<>();
        map.put (A.class, 1);
        map.put (B.class, 2);
        System.out.println (map.get(A.class));
        System.out.println (map.get(B.class));
    }

}

interface I {}

class A implements I {}

class B implements I {}
import java.util.*;
类MapExtend{
公共静态void main(字符串[]a){

Map
Map
s通常使用
Set
来存储键,因此,是的,相同的元素不能共存。您不能改为按当前值进行映射吗?您确定必须按类而不是按实例进行映射吗?否则,您不能按类和值列表/集进行映射吗?您可以有多个扩展
ISwarmEntity你不能拥有同一个类,因为你不能拥有重复的键…为什么你认为它会被覆盖。正如bros05所提到的,它只会被同一个类覆盖。而不是像你这样的不同类。寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现问题所需的最短代码。没有明确问题说明的问题对其他读者没有用处。请参阅:“Map.put(swarmmob1.class,1);Map.put(swarmmob2.class,2);”不,它不会被覆盖,你为什么这么认为?OP显然使用了你提到的第二种方法。不是第一种。很难说,
swarmmob1
表明它是一个实例,
.class
表明它是一个类。
@Test
public void testClasses() throws Exception {
    Map<Class<? extends BaseClass>, Object> map = new HashMap<>();

    map.put(ClassA.class, 1);
    map.put(ClassB.class, 2);

    assertEquals(1, map.get(ClassA.class));
}
@Test
public void testInstances() throws Exception {
    Map<BaseClass, Object> map = new HashMap<>();

    ClassA instanceA = new ClassA();
    ClassB instanceB = new ClassB();

    map.put(instanceA, 1);
    map.put(instanceB, 2);

    assertEquals(1, map.get(instanceA));
}
import java.util.*;

class MapExtend {

    public static void main (String[] a) {
        Map<Class<? extends I>,Integer> map = new HashMap<>();
        map.put (A.class, 1);
        map.put (B.class, 2);
        System.out.println (map.get(A.class));
        System.out.println (map.get(B.class));
    }

}

interface I {}

class A implements I {}

class B implements I {}