如何使用泛型向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());