在Java中,是否可以使用;原始非参数化类“-使用虚拟接口而不是虚拟接口?
我已经有一段时间没有接触Java中的泛型了,我有以下几点:在Java中,是否可以使用;原始非参数化类“-使用虚拟接口而不是虚拟接口?,java,Java,我已经有一段时间没有接触Java中的泛型了,我有以下几点: Map<List<MyGenericType>, Set<List<MyGenericType>>> x = new HashMap<>(); 我声明了x,并使用了MyGenericType的抢占式类型擦除,因为我不想仅仅为了分组而创建一个空的标记接口。为了拥有一个集合,这会对我有利吗?还是我必须制作一个标记接口来实现这一点 (编辑) 即: public接口SomeCommo
Map<List<MyGenericType>, Set<List<MyGenericType>>> x = new HashMap<>();
我声明了x
,并使用了MyGenericType
的抢占式类型擦除,因为我不想仅仅为了分组而创建一个空的标记接口。为了拥有一个集合,这会对我有利吗?还是我必须制作一个标记接口来实现这一点
(编辑)
即:
public接口SomeCommonInterface{…}
MyGenericType实现了一些公共接口…
Map x=newhashmap()代码>
回想一下,
Integer
和Double
都扩展了Number
,反过来,Number
扩展了对象
列表
不能用作列表,反之亦然<代码>列表x=新数组列表
未编译。这被称为“不变性”,它是“正确的”,因为如果它编译了,您可以向整数列表中添加双精度,这显然是不正确的。不过,它往往会让人反感,这就是我提到它的原因。如果你想要协方差或逆变,你必须选择这个:List这并不是一个真正的答案,但正如评论中所说的,我认为添加通配符解决不了任何问题
根据这张地图的使用地点,你可能会有某种安全感。我有好几次站在你的立场上,我知道唯一的解决办法是:
@Getter
static class Box<T> {
private Map<List<MyGenericType<T>>, Set<List<MyGenericType<T>>>> x = new HashMap<>();
}
否则,当使用原始类型或甚至?
时,您可以在键和值中放置不同的类型。使用列表
,即可变对象,作为映射中的键,不是一个好主意
为什么要使用MyGenericType
,而不使用泛型类型?为什么不添加类型?如果不知道实际类型,为什么不使用MyGenericType
?这是参数化类型和原始类型之间的区别。请参阅。@SlawMyGenericType
不是一个坏建议,但它不会停止以下操作:Map>>x=newhashmap();x、 put(List.of(new MyGenericType()),Set.of(List.of(new MyGenericType()))代码>。声明中有两个无界类型,它们是编译器的不同类型。我假定您打算编写列表。添加(5.0)
?标准java编译器不能推断出list
实际上是一个整数列表吗?此外,我想要一个不可变的有序对象集合——我已经将它改为primitivearrays@Novicegrammer无论是list.add(5)
还是list.add(5.0)
,如果List@Novicegrammer这些Q&A可能会有帮助:以及语法灵活性。我链接的Q&As说明了您为什么要这样做。列表
@Getter
static class Box<T> {
private Map<List<MyGenericType<T>>, Set<List<MyGenericType<T>>>> x = new HashMap<>();
}
new Box<Integer>().getX().put(...); // you can only put a MyGenericType<Integer> in here now