我创建了两个类,Parent和child。 我的Parent类正在实现Comparable接口 as" class Parent实现Comparable"
我还编写了一个返回列表最大元素的方法, 我有吗?超级T外卡接受任何Child类的Parent。
以下代码在子对象列表中正常工作。
public static <T extends Comparable<? super T>> T max(List <T> list){
Iterator< T> itr = list.iterator(); // line xx
T result = itr.next();
T temp ;
while(itr.hasNext()){
temp = itr.next();
if( temp.compareTo(result) > 0)
result = temp ;
}
return result ;
}
但是如果我通过使用&lt;更改max方法的proto类型来接受T的SubType的任何List。 ?延伸T> 那么上面的代码就不会编译。
Compliation Error是:无法从Iterator转换为Iterator
将xx线更改为&#34;迭代&LT; T&GT; itr =(Iterator)list.iterator();&#34;代码适用于&lt; ?延伸T>争论。
public static <T extends Comparable<? super T>> T max(List <? extends T> list){
Iterator< T> itr = (Iterator<T>) list.iterator(); // works fine
Iterator< T> itr1 = list.iterator(); // generates compile error .
T result = itr.next();
T temp ;
while(itr.hasNext()){
temp = itr.next();
if( temp.compareTo(result) > 0)
result = temp ;
}
return result ;
}
我没有得到它为什么我编译时错误被抛出。
完整代码如下:
package Generics;
import java.util.*;
public class WildCard {
public static void main(String[] args) {
List<Child> cList = Arrays.asList(new Child("c1"),new Child("c3"),new Child("c2"));
System.out.println(max(cList));
}
public static <T extends Comparable<? super T>> T max(List <? extends T> list){
Iterator< T> itr = (Iterator<T>) list.iterator();
T result = itr.next();
T temp ;
while(itr.hasNext()){
temp = itr.next();
if( temp.compareTo(result) > 0)
result = temp ;
}
return result ;
}
}
class Parent implements Comparable<Parent>{
private String val ;
public Parent(String val){
this.val = val ;
}
@Override
public int compareTo(Parent o) {
// TODO Auto-generated method stub
return this.val.compareTo(o.val);
}
public String toString(){
return val ;
}
}
class Child extends Parent{
public Child(String val) {
super(val);
}
}
即使我不使用,我的疑问是什么?在函数参数中扩展T, 我能够接受这些亚型,我不需要任何铸造。 但是为什么要改变这种语法我需要输入类型?
答案 0 :(得分:0)
由于您有List<? extends T>
,因此您应该使用Iterator<? extends T>
:
Iterator<? extends T> itr = list.iterator();
Iterator
无论如何都是T
的制作人,所以根据PECS规则(制作人extends
,消费者super
),所以它很自然无论如何,Iterator
应该extends
。