在Java中,是否可以使用;原始非参数化类“-使用虚拟接口而不是虚拟接口?

在Java中,是否可以使用;原始非参数化类“-使用虚拟接口而不是虚拟接口?,java,Java,我已经有一段时间没有接触Java中的泛型了,我有以下几点: Map<List<MyGenericType>, Set<List<MyGenericType>>> x = new HashMap<>(); 我声明了x,并使用了MyGenericType的抢占式类型擦除,因为我不想仅仅为了分组而创建一个空的标记接口。为了拥有一个集合,这会对我有利吗?还是我必须制作一个标记接口来实现这一点 (编辑) 即: public接口SomeCommo

我已经有一段时间没有接触Java中的泛型了,我有以下几点:

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
    ?这是参数化类型和原始类型之间的区别。请参阅。@Slaw
    MyGenericType
    不是一个坏建议,但它不会停止以下操作:
    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