java - 我如何进行泛型泛型?

标签 java generics generic-programming generic-list

import java.util.LinkedList;
class GenericInseption{
  public static void main(String[] args){
    LinkedList<LinkedList<Dad>> listOfLists = new LinkedList<>();
    LinkedList<Dad> list = new LinkedList<>();
    listOfLists.add(list);
    test(listOfLists);//error
  }
  private static void test(LinkedList<LinkedList<? extends Person>> listOfLists){
    for(LinkedList<? extends Person> list : listOfLists){
      for(Person person : list){
        //peform operation on person objects
      }
    }
  }
}
class Person{}
class Dad extends Person{}

错误

GenericInseption.java:7: error: method test in class GenericInseption cannot be applied to given types;
    test(listOfLists);//error
    ^
  required: LinkedList<LinkedList<? extends Person>>
  found: LinkedList<LinkedList<Dad>>
  reason: argument mismatch; LinkedList<LinkedList<Dad>> cannot be converted to LinkedList<LinkedList<? extends Person>>
1 error

但是 LinkedList 是 LinkedList< 的子类型?扩展人>

这应该如何工作?

最佳答案

尽管LinkedList<Dad>LinkedList<? extends Person> 的子类型,一个LinkedList<LinkedList<Dad>>不是 LinkedList<LinkedList<? extends Person>> 的子类型,出于同样的原因 List<Dog>不是 List<Animal> 的子类型-- Java 的泛型是不变的。在这种情况下,它们在每个级别都是不变的,而不仅仅是在 ? extends Person 上。但处于LinkedList<? extends Person>水平级别。

LinkedList 前面添加另一个通配符在test中的第一级泛型中方法。

//                                  vvvvvvvvv
private static void test(LinkedList<? extends LinkedList<? extends Person>> listOfLists){

或者,为了使其更广泛适用,请使用 List而不是LinkedList :

private static void test(List<? extends List<? extends Person>> listOfLists){
    for(List<? extends Person> list : listOfLists){

关于java - 我如何进行泛型泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36229268/

相关文章:

java - 使用语音识别将单个字符识别为java

java - 相同通配符的下限和上限通用约束

c# - 将 Action<.., .., T > 作为没有预定义数量的 Action 参数的参数传递

c++ - 有条件使用声明

java - 如何使用泛型: Class<Clazz<G>>传递参数

java - Spring REST 406 Http 错误

java - 将字符串解析为时间使得 01 :00:00

java - JAXB 使用 ID 引用而不是包含来序列化 XML

基于接口(interface)设计的C#泛型方法

Java 泛型初学者 - 关于类型安全声明和实例化的编译器警告