这些通用声明之间有什么区别?

MBl*_*anc 2 java generics nested-generics

您如何用简单的英语描述这些列表内容之间的区别?

我正在寻找一个可以作为参考的简单比较.

/* 1 */ List<          List<          Dog>>
/* 2 */ List<          List<? extends Dog>>
/* 3 */ List<? extends List<          Dog>>
/* 4 */ List<? extends List<? extends Dog>>
Run Code Online (Sandbox Code Playgroud)

通用声明super类似.那么这些呢:

/* 5 */ List<? super   List<? extends Dog>>
/* 6 */ List<? extends List<? super   Dog>>
Run Code Online (Sandbox Code Playgroud)

相关问题和资源

awk*_*ksp 7

  1. List,其元素是狗的名单
  2. List其元素的类型列出了extends Dog
  3. 一个List其元素是一个单一的狗列表亚型
  4. A List的元素是a的单个子类型(类型的列表extends Dog)
  5. List其元素是一个一的超类型(类型的列表extends Dog)
  6. A List的元素是a的单个子类型(类型的列表super Dog)

其中"subtype","supertype","super"和"extends"是"通用"版本(即还包括边界类型)


示例Number和子类型,因为为什么不.替换DogNumber.

  1. List<List<Number>>可能看起来像2D Number元素数组.很简单.

  2. List<List<? extends Number>>可能看起来像2D数组,其中每一行都是不同的数字子类型.例如,第一行可能是a List<Integer>,第二行可能是a List<Double>等.

  3. List<? extends List<Number>>可能是List<ArrayList<Number>>,List<List<Number>>,List<LinkedList<Number>>Number有留下来,因为泛型是不变的,但你可以有List或任何其亚型为"整体式"的元素.您只能选择其中一个List或其子类型,而您选择的那个必须保持不变.

  4. List<? extends List<? extends Number>>类似于List<? extends List<Number>>,除了现在您可以选择Number或其任何子类作为"整体"2D数组的元素.所以,你可以有List<List<Integer>>,List<ArrayList<Integer>>,List<LinkedList<Double>>,等和以前一样,你只能挑一个List的亚型之一Number的亚型.

  5. (棘手!)List<? super List<? extends Number>>似乎等同于List<List<? extends Number>>,List<Collection<? extends Number>>等等,但没有 List<List<Number>>或使用子类型的任何具体Number内容.我认为这是因为List<Number>不被认为是超类型List<? extends Number>,我认为由于泛型不变而有意义.List<Object>和原始类型(List<List>,List<Collection>,等)也适用.
  6. 与4相同,除了你得到List<Number>或者List<Object>(显然List<Serializable>)作为内部列表.

作为@MadProgrammer表示,由于佩奇(生产商扩展-消费者-超级),任何时候你有? extends你的泛型类型,您将无法更新列表中,只有从中检索项目.所以没有 - add()没有 - 没有set().