Javaの型推論Utilsクラス

いろんな方々のブログから集めてまとめた、型推論を使ったUtilsクラスです。結構便利です。Java 5で導入された型推論を使っています。Java 7で型推論をさらに強化するという案もあるそうですね。

(2008/4/15 追記)set() を map() と同じインターフェイスにしていたのですが、list() と同じインターフェイスで良いので修正しました。まぁ、Set に一度に2個以上挿入する機会は少ないからなぁ。

(追記2)http://d.hatena.ne.jp/amachang/20080415/1208229209 amachang に記事を紹介してもらった!cast()はよそのメソッドの引数に対しては使えません。amachang のブログのコメント欄をご覧ください。

(2008/4/17 追記3)array() を追加。

まず、使い方。

import static com.example.Utils.*;

// 型推論で空のインスタンス作成。
// 変数の型と値の型、同じ物を2回書かなくてOK。
ArrayList<String> strs = list();
HashMap<String, Date> dateMap = map();
HashSet<File> files = set();

// 型推論を使って、カンマ区切りや数珠繋ぎでインスタンス作成。
// 同じ型の値のみを追加できます。
array("Hello", "World");
list("a", "b", "c");
map(100, "apple").x(200, "banana").x(300, "cherry");
set((Number) 3.14159, 1.4142f); // 必要ならこのように型キャスト

// 型推論による型キャスト。
// @SuppressWarnings("unchecked") を回避して型キャストします。
List<?> typeUnknownList = list();
List<String> castList = cast(typeUnknownList);

そして、ソース。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;

public class Utils {
    @SuppressWarnings("unchecked") public static <T> T cast(Object x) {
        return (T) x;
    }

    public static <T> T[] array(T... items) {
        return items;
    }

    public static <T> ArrayList<T> list(T... items) {
        return new ArrayList<T>(Arrays.asList(items));
    }

    public static <T> HashSet<T> set(T... items) {
        return new HashSet<T>(Arrays.asList(items));
    }

    public static <S, T> SmartMap<S, T> map() {
        return new SmartMap<S, T>();
    }

    public static <S, T> SmartMap<S, T> map(S key, T value) {
        return new SmartMap<S, T>().x(key, value);
    }

    public static class SmartMap<S, T> extends HashMap<S, T> {
        private static final long serialVersionUID = -5246024784852709874L;

        public SmartMap<S, T> x(S key, T value) {
            put(key, value);
            return this;
        }
    }
}