java - 为什么这个使用泛型的 HashMap 声明是错误的?

标签 java generics serialization arraylist hashmap

HashMap<String, ArrayList<? extends Serializable>> map = new HashMap<String, ArrayList<ArrayList>>();

这不能编译。据我对 Java 泛型的了解,应该如此。 还有这个:

ArrayList<? extends Serializable> c = new ArrayList<ArrayList<String>>();

编译成功。

谁能告诉我为什么上面的代码不能编译吗?

最佳答案

你为什么认为应该这样做?一个HashMap<String, Apple>永远不能从 HashMap<String, Orange> 分配对于任何可能的不平等AppleOrange ,只要 AppleOrange不是通配符类型。

ArrayList<? extends Serializable>ArrayList<ArrayList<?>> 不一样.

你的意思可能是:

HashMap<String, ? extends ArrayList<? extends Serializable>> map = 
  new HashMap<String, ArrayList<ArrayList<?>>>();

现在它可以编译了,因为确实:

? extends Serializable // can be assigned from
          ArrayList<?>

? extends ArrayList<? extends Serializable> // can be assigned from
          ArrayList<          ArrayList<?>>

关于java - 为什么这个使用泛型的 HashMap 声明是错误的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49061565/

相关文章:

java - JSF 2.0 使用 Flying Saucer 将 XHTML 页面转换为 PDF : java. lang.IllegalStateException

java - Java 中的 AWS DynamoDB 和 MapReduce

java - 具有 Java 互操作性的 ANTLR DSL

serialization - 尝试扩展 JSONSerializer 时未定义 get

android - parcelable 值得实现以在 Activity 之间传递数据吗?

java - Spring-data-elasticsearch “nested query throws [nested] failed to find nested object under path”异常

Java 泛型扩展返回方法转换错误

java - 为什么我不能将 String 数组与采用 Iterable 作为参数的方法一起使用?

java - 泛型和通配符 : Java likes "new Foo<Bar<?>>"

python - Serializer 上的 SerializerClass 字段从主键保存