泛型[7]一个复杂泛型示例研究

来源:互联网 发布:淘宝激光脱毛器好用吗 编辑:程序博客网 时间:2024/06/07 18:06

 

java.util.Collections中有这样一个方法


这里是在定义泛型 添加extends限制时 使用了泛型通配符 作为类型。

publicstatic <TextendsComparable<?super T>>void sort(List<T>list)

 

意思就是说,传进来的这个类型T得实现/继承自Comparable<?super T>

Textends Comparable<?super T>

注意这里虽然Comparable是接口,但是依然是用extends,参见“定义&传递”章节extends interface小节。即

Timplements Comparable<?super T>

 

 Java Code 

 


public class Fruit {

}

class Apple extends Fruit implements Comparable<Object>{

    @Override
    
public int compareTo(Object o) {
        
return 0;
    }
    
}

//class Apple extends Fruit implements Comparable<Fruit>{
//
//  @Override
//  public int compareTo(Fruit o) {
//      return 0;
//  }
//  
//}
//
//class Apple extends Fruit implements Comparable<Apple>{
//
//  @Override
//  public int compareTo(Apple o) {
//      return 0;
//  }
//  
//}

////这样不行
//class Apple extends Fruit implements Comparable<FujiApple>{
//
//  @Override
//  public int compareTo(FujiApple o) {
//      return 0;
//  }
//  
//}


class Pear extends Fruit{
    
}

class FujiApple extends Apple{
    
}

 

如果给Apple再嵌套泛型的时候,还可以这样

 Java Code 

 

class Apple<T> extends Fruit implements Comparable<Apple<T>>{

    @Override
    
public int compareTo(Apple<T> o) {
        
return 0;
    }
    
}

 

 Java Code 

 

ArrayList<Apple<Object>> list1 = new ArrayList<Apple<Object>>();
Collections.sort(list1);

ArrayList<Apple<
String>> list2 = new ArrayList<Apple<String>>();
Collections.sort(list2);

 

但实际上做实验的时候还手残写了这样的,并且这个在传Apple<Object>的时候还可以通过,但是在传apple<Integer>的时候就露馅了。

 Java Code 

 

////这个只有TObject的时候可以编译通过
class Apple<T> extends Fruit implements Comparable<T>{

    @Override
    
public int compareTo(T o) {
        
return 0;
    }
    
}



这是因为传Object的时候带入Apple<T>中是

Apple<Object> extends Fruitimplements Comparable<Object>

是满足

Timplements Comparable<?super T>

Apple<Object>implements Comparable<? superApple<Object>>

 

0 0
原创粉丝点击