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而不是使用的集合。
答案 0 :(得分:1)
这与Generics无关。
看看API。 descendingIterator
是Deque
而非List
我的问题:一般来说上面是使用泛型的缺点,即每次我们需要将对象强制转换为子类来访问子类的方法,或者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()的实现)