关于java泛型中"超级"通配符的详细信息

Rol*_*all 5 java generics super

我有关于泛型的问题:

Map<? super String, ? super String> mappa1 = new HashMap<Object,Object>();
Run Code Online (Sandbox Code Playgroud)

超级可以实例化HashMap<Object,Object>a <? super String>.但是,您只能添加扩展String的对象(在本例中只是String本身).他们为什么不禁止编译错误以及使用extends通配符.我的意思是,如果曾经创建了一个Map <Object, Object>它可能只添加字符串..为什么不强制创建一个Map<String, String>首先?(就像extends通配符一样)

再次,我知道之间的差别superextends有关仿制药.我想知道我上面提到的细节.

提前致谢.

axt*_*avt 6

让我们使用List而不是Map为了简洁.

基本上,实际意义extendssuper定义如下:

  • List<? extends T>意思是" List你可以得到T的"
  • List<? super T>意思是" List你可以投入T"

现在你可以看到没有什么特别的extends- 行为extendssuper完全对称:

List<? extends Object> a = new ArrayList<String>(); // Valid, you can get an Object from List<String>
List<? extends String> b = new ArrayList<Object>(); // Invalid, there is no guarantee that List<Object> contains only Strings

List<? super String> a = new ArrayList<Object>(); // Valid, you can put a String into List<Object>
List<? super Object> b = new ArrayList<String>(); // Invalid, you cannot put arbitrary Object into List<String>
Run Code Online (Sandbox Code Playgroud)


Mar*_*nik 2

Map<? super String, ? super String> mappa1 = new HashMap<Object,Object>();
Run Code Online (Sandbox Code Playgroud)

由于 Java 泛型基于类型擦除,因此在这一行中您没有创建MashMap<Object,Object>. 您刚刚创建了该类的一个实例HashMap;类型参数在这行代码之后立即丢失,剩下的只是mappa1变量的类型,甚至没有提到Object. 表达式的类型new与 的类型赋值兼容mappa1,因此编译器允许赋值。

一般来说,使用的类型参数new是无关紧要的,为了解决这个问题,Java 7 引入了菱形运算符 <>。真正重要的是 的类型mappa1,即 is Map<? super String, ? super String>;就其余代码而言,这是实例化映射的类型。