Effective Javaを読んでいる㉗

再起型境界

import java.util.List;

public class Test {
    //引数がCompareble2<T>型のリストであることが保証されるためOK
    private static <T> Comparable2<T> max1(List<Comparable2<T>> list){
        Comparable2<T> max = list.get(0);
        for(Comparable2<T> t : list){
            if(max.compareTo(t) > 0){
                max = t;
            }
        }
        return max;
    }

    //TはCompareble<T>を継承していることが保証されるためOK
    private static <T extends Comparable<T>> T max2(List<T> list){
        T max = list.get(0);
        for(T t : list){
            if(max.compareTo(t) > 0){
                max = t;
            }
        }
        return max;
    }

    //これはだめ
    private static <T> Comparable<T> max3(List<Comparable<T>> list){
        Comparable<T> max = list.get(0);
        for(Comparable<T> t : list){
            //Compareble<T>のcompareToの引数はT型であり、Compareble<T>型ではないため不可!!
            if(max.compareTo(t) > 0){
                max = t;
            }
        }
        return max;
    }
}

interface Comparable2<T>{
    /** 引数のがおおきかったら正、小さかったら負、同じだったら0を返す */
    int compareTo(Comparable2<T> t);

    //Comparebleではメソッドの範囲でTがComparableを実装していることを保証していない
    // int compareTo(T t);
}

読んでおきたい d.hatena.ne.jp