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; } } }