Generics、続き。

先日の続き的な感じで。

  • パラメータのクラスが結果を格納するクラスに属さない場合、error扱いでチェックされる。
  • パラメータに互換性がないクラスを指定するとwarning扱いでチェックされ、実行時に当然ClassCastException。
  • 比較が1回多い件は、とりあえず大目に見て下さい。

この「静的にチェックできるところは極力チェックする」っていうjavaの特徴は、逆に、javascriptとかの所謂Light Weight Languageよりも気軽にそれなりのコードを書ける利点だと思うんだけど、どーなんでしょうか。

import java.math.BigDecimal;

public class Max {
    
    /**
     * 指定したパラメータの最大値を返却する。
     * @param <T>
     * @param ts
     * @return 最大値
     */
    public static <T> T max(T...ts){
        if(ts==null||ts.length==0){
            return null;
        } else {
            T ret = ts[0];
            Comparable retc = (Comparable) ret;
            for (T t : ts) {
                Comparable c = (Comparable) t;
                if(retc.compareTo(c)<0){
                    ret = t;
                    retc = c;
                }
            }
            return ret;
        }
    }
    
    /**
     * 動作確認用
     * @param args
     */
    public static void main(String[] args) {
        String maxString = Max.max("a","あ","b");
        System.out.println(maxString);  //"あ"
        
        Integer maxInteger = Max.max(1,2,10,-1);
        System.out.println(maxInteger); //10
        
        BigDecimal maxBigDecimal = Max.max(new BigDecimal(1),new BigDecimal(0.2),new BigDecimal(1.0012));
        System.out.println(maxBigDecimal);  //1.0012
//      maxInteger = Max.max(new BigDecimal(1),new BigDecimal(0.2),new BigDecimal(1.0012)); //Type mismatch
        
        Object maxObject = Max.max(1,10);
        System.out.println(maxObject);  //10
//      maxObject = Max.max(1,"hoge");  //throws ClassClastException
        
        java.util.Date maxDate = Max.max(new java.util.Date(), java.sql.Date.valueOf("2010-01-01"));
        System.out.println(maxDate);    //"2010-01-01"
    }
}