ジェネリクス
先のエントリは引数の型を制限する話でしたが、今回は引数がパラメータ化された型の場合、その実型引数を制限するのに型変数が使えるという話です。3つのケースを紹介します。 複数の実型引数間の関係を制限 たとえば、A×B (AとBの直積型)を表すクラスPairが…
ジェネリックな設計 基礎編 - プログラマーの脳みそに、メソッドをジェネリックにするべき分かりやすい条件があり、感銘を受けました。 ジェネリックメソッドでの型変数というのはこのようなメソッドに対してInとOutのデータの型の関連性を表現します。 複数…
詳細なコーディング規約として愛用している、Javaセキュアコーディングスタンダードの訳がおかしいのでメモ。 OBJ03-J. ジェネリックな未加工型とジェネリックでない未加工型を新規コードに混在させない http://www.jpcert.or.jp/java-rules/obj03-j.html ジ…
概要 C とC は同じ。(Cの場合) D とD は同じ。(Dの場合) D とD は同じ。(Dの場合) ただし、3つめはEclipseコンパイラではダメだった。 確認コード 代入変換で確認。 C<A>とC<B>はAとBが等しくないと互いに代入できないはず。 package test; import java.io.Seriali</b></a>…
メソッドの引数を検査する時など、何種類かの例外を投げ分けたい場合があります。 これはなるべく短くしたいですね。そこで1文で書いてみましょう。 package test; public class Throw2Test { @SuppressWarnings("serial") static class HogeException exten…
概要 wild.field に wild.fieldが代入できなくなる やり方 型変数TをもつクラスCを用意します。 CはT型のフィールドfieldをもちます。 C型の変数wildを用意すると、wild.fieldにはwild.fieldが代入できません package test; public class CaptureConversionT…
先日のエントリー 仮型引数と実型引数の混同に関する考察 で仮型引数 (type parameter) と実型引数 (type argument) の話をしました。 では、実型引数を仮型引数に「渡す」ことは仕様では何と呼ぶのでしょうか。 The type argument list denotes a particula…
Javaジェネリクス初心者は と Hoge>の違いが分からない! とよく混乱します。前者はtype parameter*1として、後者はtype argumentとして使われる表現で、出てくる文脈が違うものです。では、なぜこの2つは混同されるのでしょうか? 一つの原因はどちらも<>と…
upper bound, lower boundは順序集合の文脈で「上界」「下界」と訳されます。 参考: Wikipedia http://ja.wikipedia.org/wiki/%E9%A0%86%E5%BA%8F%E9%9B%86%E5%90%88 ところがJavaの型の文脈では「上限(境界)」「下限(境界)」と訳されます。 参考: TypeVaria…
メソッドと同じく、コントストラクタをジェネリックにする(型パラメータをとる)ことができる。 ところがコンストラクタの型パラメータの使い途がよく分からない。参考: コンストラクタジェネリック - カタヤマンがプログラマチックに今日もコードアシスト En…