【问题标题】:unable to access subclass method, is it disadvantage of Generics? or i am missing something无法访问子类方法,是泛型的缺点吗?或者我错过了什么
【发布时间】:2016-12-26 12:31:39
【问题描述】:
List<Employee> empLList = new LinkedList<>();
        empLList.add(...)
Iterator<Employee> descItr = empLList.descendingIterator();

在上面的代码中,我无法访问 descendingIterator 并出现以下错误

cannot find symbol
  symbol:   method descendingIterator()
  location: variable empLList of type List<Employee>

要获得 descendingIterator,我必须将 empLList 重铸为 LinkedList

 Iterator<Employee> descItr = ((LinkedList) empLList).descendingIterator();

我的问题:一般来说,以上是使用泛型的一个缺点,即每次我们需要将对象转换回子类以访问子类的方法,或者泛型应该像那样工作。

或者,如果我们依赖太多子类的方法,我们不应该使用泛型

或者我错过了什么

我对示例中 GENERICS 的使用而不是所使用的集合感到好奇。

【问题讨论】:

    标签: java generics linked-list


    【解决方案1】:

    这与泛型无关。

    查看 API。 descendingIteratorDeque 不是 List 的方法

    LinkedList 实现Deque

    我的问题:一般来说,以上是使用泛型的一个缺点,即每次我们需要将对象转换回子类以访问子类的方法,或者泛型应该像那样工作。

    您的 sn-p 错误与泛型概念无关。基于强制转换的逻辑非常非常糟糕,应该通过更正设计来替换为多态。

    我对示例中 GENERICS 的使用而不是所使用的集合感到好奇。

    然后提出正确的问题。

    更改为以下以使其工作:

    Deque<Employee> empLList = new LinkedList<>();
    empLList.add(...)
    Iterator<Employee> descItr = empLList.descendingIterator();
    

    【讨论】:

      【解决方案2】:

      这与泛型无关。 List 接口是一个契约,定义了它的所有实现必须提供的方法。有些,比如LinkedList,可能会提供额外的方法(比如前面提到的descendingIterator())。

      您的员工列表被视为List 的任何实现,因此所有List 方法都可以使用,仅此而已。 如果您知道您的实现是 LinkedList,您可以 强制转换,但这是不好的做法。最好将其保留为LinkedList 然后:

      LinkedList<Employee> empLList = new LinkedList<>();
      empLList.add(...)
      Iterator<Employee> descItr = empLList.descendingIterator();
      

      ...或者(如果您接受任何List,但想使用descendingIterator()),创建一个新的LinkedList 出来:

      List<Employee> empLList = ... // any implementation 
      empLList.add(...) 
      Iterator<Employee> descItr = new LinkedList(empLList).descendingIterator();
      

      【讨论】:

        【解决方案3】:

        这不是因为泛型。这是因为,List 中没有 descendingIterator() 方法。在这一行

          Iterator<Employee> descItr = empLList.descendingIterator();
        

        您正在对列表类型引用变量调用该方法。结果你得到编译错误。 说到下一行

          Iterator<Employee> descItr = ((LinkedList) empLList).descendingIterator();
        

        您正在将您的 empList 转换为 LinkedList,并且方法在 LinkedList 中可用,因为它实现了 Deque(在 LinkedList 中提供了 descendingIterator() 的实现)

        【讨论】:

          猜你喜欢
          • 2020-08-02
          • 2014-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-11
          • 2011-08-19
          • 1970-01-01
          • 2015-08-14
          相关资源
          最近更新 更多