无法访问子类方法,Generics的缺点是什么?或者我错过了什么

时间:2016-12-26 12:31:39

标签: java generics linked-list

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应该像那样工作。

或者,如果我们依赖太多的子类'方法

,我们不应该使用泛型

或者我错过了什么

我很好奇在示例中使用GENERICS而不是使用的集合。

3 个答案:

答案 0 :(得分:1)

这与Generics无关。

看看API。 descendingIteratorDeque而非List

的方法

LinkedList实施Deque

  

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

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

  

我很好奇在示例中使用GENERICS而不是使用的集合。

然后提出正确的问题。

更改为以下内容以使其正常工作:

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

答案 1 :(得分:1)

这与泛型无关。 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();

答案 2 :(得分:0)

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

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

您正在列表类型referenece变量上调用该方法。因此,您将收到编译错误。 当涉及到以下行

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

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