如何使用泛型向java映射添加相同的对象类型

如何使用泛型向java映射添加相同的对象类型,java,generics,Java,Generics,我有两个目标如下 public class MyObject1 implements Serializable { private Long id; ... other properties and getters and setters } public class MyObject2 extends MyObject1 { private String name; ...other properties and getters and setters } MyObject1 obj1

我有两个目标如下

public class MyObject1 implements Serializable
{

private Long id;
... other properties and getters and setters
}

public class MyObject2 extends MyObject1
{
private String name;
...other properties and getters and setters
}

MyObject1 obj1 = new MyObject1();
MyObject2 obj2 = new MyObject2();
如何使用泛型在HashMap中添加这两个实例

更新

我希望能够在同一地图中添加MyObject1和MyObject2。 像


希望现在更清楚。

让我们假设id是关键。应该是这样的:

Map<Long, MyObject1> map = new HashMap<Long, MyObject1>();
map.add(obj1.getId(), obj1);
map.add(obj2.getId(), obj2);
Map Map=newhashmap();
add(obj1.getId(),obj1);
add(obj2.getId(),obj2);

让我们假设id是键。应该是这样的:

Map<Long, MyObject1> map = new HashMap<Long, MyObject1>();
map.add(obj1.getId(), obj1);
map.add(obj2.getId(), obj2);
Map Map=newhashmap();
add(obj1.getId(),obj1);
add(obj2.getId(),obj2);

您可以直接使用
地图

Map Map=newhashmap();
map.put(1l,新的MyObject1());
map.put(2l,新的MyObject2());
注:


?extends MyObject1
是一个通配符。它代表“某个未知类型,我们只知道它是Object的一个子类型”。声明中没有问题,但您不能实例化它,因为它不是实际的类型。

您可以直接使用
Map

Map Map=newhashmap();
map.put(1l,新的MyObject1());
map.put(2l,新的MyObject2());
注:


?extends MyObject1
是一个通配符。它代表“某个未知类型,我们只知道它是Object的一个子类型”。在声明中可以,但不能实例化它,因为它不是实际的类型。

在映射中,将键映射到对象。在你的例子中,什么是键,什么是对象?你不能让
映射中的
添加(对象)
(单参数方法)
在映射中,你将键映射到对象。在你的例子中,什么是关键,什么是对象?你不能在
map
中使用
add(object)
(单参数方法)好的,所以我的答案是错误的。那么,将map声明为
map
map
之间有什么区别呢?在第一种情况下,有一种固定但未知的类型扩展了
MyObject1
,它实际上是值类型。因此,例如,您可以将
Map
分配给
Map
。(这就是为什么您的解决方案不起作用的原因:因为Java阻止您将
MyObject1
放入一个可能只接受
MyObject2
的映射中)@louiswasserman,当然可以,但您什么时候会使用一个而不是另一个。除非您从其他地方收到映射,否则请始终使用
映射,并且想允许一个
映射
。好的,所以我的答案是错误的。那么,将map声明为
map
map
之间有什么区别呢?在第一种情况下,有一种固定但未知的类型扩展了
MyObject1
,它实际上是值类型。因此,例如,您可以将
Map
分配给
Map
。(这就是为什么您的解决方案不起作用的原因:因为Java阻止您将
MyObject1
放入一个可能只接受
MyObject2
的映射中)@louiswasserman,当然可以,但您什么时候会使用一个而不是另一个。除非您从其他地方收到映射,否则请始终使用
映射,并希望允许一个
映射
Map<Long, MyObject1> map = new HashMap<Long, MyObject1>();
map.add(obj1.getId(), obj1);
map.add(obj2.getId(), obj2);
Map<Long, MyObject1> map = new HashMap<Long, MyObject1>();
map.put(1l, new MyObject1());
map.put(2l, new MyObject2());