Generics

ジェネリクスと配列

Javaのジェネリクスは一般に配列と混ぜてはいけないとされるが、混ぜて用いた場合に何が問題となるのか。 歴史的な問題 Javaが1995年に登場した当時、Javaに配列はあったがジェネリクスはなかった。ジェネリクスを含む型システムの理論的な整備は、1990年代…

Java Generics Hell - new T()

Java Generics Hell アドベントカレンダー 24日目。 前回(22日目) イレイジャ 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。今回はJavaのジェネリクスでは型変数を用いてnew T()できないけど特に問題ないという話。 コンストラクタの形 コンス…

Java Generics Hell - イレイジャ

Java Generics Hell アドベントカレンダー 22日目。 前回(20日目) ブリッジメソッド 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。 メソッドのオーバーロード Javaのジェネリクスのイレイジャについて語るには、まずメソッドのオーバーロード…

Java Generics Hell - ブリッジメソッド

Java Generics Hell アドベントカレンダー 20日目。 前回(19日目) 内部クラスと型変数のスコープ 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。 共変戻り値 Java5以降ではメソッドをオーバーライドするときに、戻り値をより具体的な型としてオ…

Java Generics Hell - 内部クラスと型変数のスコープ

Java Generics Hell アドベントカレンダー 19日目。 前回(18日目) ジェネリックな例外 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。Javaでは1ファイルにトップレベルのpublicなclassはひとつしか置けないが、入れ子になったクラスなどを用意…

Java Generics Hell - ジェネリックな例外

Java Generics Hell アドベントカレンダー 18日目。 前回(16日目) 型変数のバインド 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。 throws E Java のジェネリクスの型変数は例外のthrows宣言でも用いることができる。型変数の宣言時にthrow可…

Java Generics Hell - 型変数のバインド

Java Generics Hell アドベントカレンダー 16日目。 前回(15日目) ワイルドカード落穂ひろい 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。 メソッドスコープの型変数 メソッドスコープの型変数へのバインドについては以前も書いたが再掲して…

Java Generics Hell - ワイルドカード落穂ひろい

Java Generics Hell アドベントカレンダー 15日目。 前回(14日目) http://d.hatena.ne.jp/Nagise/20171214/1513260215=反変ワイルドカード 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。共変ワイルドカードと反変ワイルドカードについて書いた…

Java Generics Hell - 反変ワイルドカード

Java Generics Hell アドベントカレンダー 14日目。 前回(13日目) 共変ワイルドカード 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。 反変ワイルドカード さて、前回は共変ワイルドカードについてだった。今回は反変ワイルドカードについてで…

Java Generics Hell - 共変ワイルドカード

Java Generics Hell アドベントカレンダー 13日目。 前回(11日目) 型変数の境界 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。 変性 パラメタライズドタイプについては以前に書いたが、ワイルドカードについては後回しということにしていた。<…

Java Generics Hell - 型変数の境界

Java Generics Hell アドベントカレンダー 11日目。 前回(8日目) インスタンススコープのジェネリクス 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。週末サボりました。すいません。 型変数の境界 ここまでは話を簡単にするために型変数の境界…

Java Generics Hell - インスタンススコープのジェネリクス

Java Generics Hell アドベントカレンダー 8日目。 前回(7日目) メソッドスコープのジェネリクス 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。ようやくクラスの型変数の話にたどり着いた。なかなか話題が多くて大変なのである……。 インスタン…

Java Generics Hell メソッドスコープのジェネリクス

Java Generics Hell アドベントカレンダー 7日目。 前回(6日目)ジェネリクスの構文 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。前回、構文の話をしていたが、そのなかでメソッドスコープのジェネリクスをいったんおいていた。 今回はそのあ…

Java Generics Hell - ジェネリクスの構文

Java Generics Hell アドベントカレンダー 6日目。 前回(5日目) パラメタライズドタイプ 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。ここまで話の簡単のためにいろいろ端折って書いてきているのだが、徐々に詳細を書かねばなるまい。同時に…

Java Generics Hell - パラメタライズドタイプ

Java Generics Hell アドベントカレンダー 5日目。 1日目 Java Generics Hell 序章 2日目 オブジェクト指向 3日目 リスコフの置換原則 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。 パラメタライズドタイプ Javaのジェネリクス周りは一緒くた…

Java Generics Hell - 配列と変性

Java Generics Hell アドベントカレンダー 4日目。 1日目 Java Generics Hell 序章 2日目 オブジェクト指向 3日目 リスコフの置換原則 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。前回は継承のある型システムで重要な「リスコフの置換原則」…

Java Generics Hell - リスコフの置換原則

Java Generics Hell アドベントカレンダー 3日目。 1日目 Java Generics Hell 序章 2日目 オブジェクト指向 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。前回はオブジェクト指向の中核が(継承に限定せず幅広い意味での)ポリモーフィズムで…

Java Generics Hell - オブジェクト指向

Java Generics Hell アドベントカレンダー 2日目。 1日目 Java Generics Hell 序章 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。前回は与太話だった。ジェネリクスの話をする前にOOP(オブジェクト指向プログラミング)について整理しておか…

Java Generics Hell 序章

気合が続くか分からない Java Generics Hell アドベントカレンダー 1日目。読者の推奨スキルとしてはOCJP Silverぐらいを想定している。 導入 JavaのジェネリクスはJavaが設計された当初(Javaは1995年に発表されている)から検討はされてはいたものの、実装が…

Java本格入門のジェネリクスの用語訂正案

聞くところJava本格入門(通称アクロ本)の評判がすこぶる良いようだ。1995年にJavaが発表されてから随分と経つ。Javaのメジャーバージョンも8を数え、9がリリースされようとしている。1990年代にはこの新しい言語についてたくさんの技術書が発行されたが、…

贖罪のイレイジャ

Javaのジェネリクスでしばしば話題に上がる「イレイジャ」について整理しておきたい。イレイジャについては僕もいろいろと誤解しており、過去に誤った発言をしている。本エントリはその贖罪として書かれたものである。「イレイジャ」という方式についてはネ…

FutureTaskのコンストラクタと魔法のバインド

java.util.concurrent.FutureTaskのコンストラクタの定義が public FutureTask(Callable callable) http://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/FutureTask.html#FutureTask-java.util.concurrent.Callable- とCallable<V>となっていてC</v>…

Java8流インスタンスを生成するメソッドの書き方

メソッド内部で任意の型のインスタンスを生成してオブジェクトを返す場合 public static <T> T hoge(Class<T> clazz) { try { return clazz.newInstance(); } catch (ReflectiveOperationException e) { throw new RuntimeException(e); } } といったようにjava.la</t></t>…

引数と戻り値の不一致 - ジェネリクス・ケーススタディ

ある型のインスタンスを受け取り、Listにして返すメソッドを考えよう。 public static <T> List<T> wrap(T value) { List<T> list = new ArrayList<T>(); list.add(value); return list; } このとき、型変数はメソッドのIn / Outで型の関連を表現できさえすればよいので</t></t></t></t>…

Mapの置換にみるジェネリクス表現

Javaのジェネリクスについて考察するのに丁度良いテーマを見つけたので忘れないうちに書いておく。Map を Mapに変換するメソッドを作るという話題。 public static <K,V> Map<V,K> swap1(Map<K,V> origin) { // 略 } 単にMapからMapに変換するなら上記のようなメソッドシグ</k,v></v,k></k,v>…

コンパイル時警告に注意

http://aoking.hatenablog.jp/entry/20100427/1272326219での主張は public class Sample { public static void main(String[] args) { List<Integer> list = getList(); System.out.println(list); } public static <T> List<T> getList() { List<T> list = new ArrayList<T>(); </t></t></t></t></integer>…

可変長な型変数の表現

さて、前回のエントリを枕として、JavaでTuple的なモノのサンプルを書いたのだけど、汎用のTupleというか、値を2つだけとるPairとでも名乗るべきモノだった。みなさん御存知の通り、型変数は可変長に宣言することができない。そもそもJavaの文法的には型変…

new T()したいケースへの対処法

Javaのジェネリクスの話題のひとつにnew T()したいができないので困る、というテーマがある。 先日のセッションではこの対策についても簡単に述べたが今日はそのまとめ。まず第一に疑うべきは本当にnew T()する必然性があるか?というのが持論だが、ある種の…

Semicolonless Java8

JJUG CCC 2013 Fallの懇親会のLT(ライトニングトーク)でSemicolonless Java8について発表しました。Semicolonless Java とはエクストリームプログラミング(要するにプログラミングの縛りプレイ)でルールは以下のとおりです。 セミコロンを用いてはいけない …

JJUG CCC 2013 Fall でジェネリクスのセッションやりました

資料はslideshareに上げました。ジェネリクスの基礎と クラス設計への応用 ジェネリクスの基礎と クラス設計への応用 from nagise 内容はジェネリクスの基礎的なところから、話題を網羅する感じでかいつまんで紹介といったところです。 セッションの元ネタは…