使用带有Type参数的通配符需要额外的强制转换

时间:2016-06-29 18:12:49

标签: java generics casting comparable

我创建了两个类,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, 我能够接受这些亚型,我不需要任何铸造。 但是为什么要改变这种语法我需要输入类型?

1 个答案:

答案 0 :(得分:0)

由于您有List<? extends T>,因此您应该使用Iterator<? extends T>

Iterator<? extends T> itr = list.iterator();

Iterator无论如何都是T的制作人,所以根据PECS规则(制作人extends,消费者super),所以它很自然无论如何,Iterator应该extends