ジェネリクス

あなたの知らない、メソッドに型変数を加えるべき理由〜引数型の実型引数を制限〜

先のエントリは引数の型を制限する話でしたが、今回は引数がパラメータ化された型の場合、その実型引数を制限するのに型変数が使えるという話です。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文で2種類の例外をスローする

メソッドの引数を検査する時など、何種類かの例外を投げ分けたい場合があります。 これはなるべく短くしたいですね。そこで1文で書いてみましょう。 package test; public class Throw2Test { @SuppressWarnings("serial") static class HogeException exten…

fieldにfieldが代入できないぜぇ ワイルドカードだろ〜?

概要 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を上限境界と訳すのが心苦しい

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…