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){
MapMap
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 {}