Generics

Javaのジェネリクスとリフレクション応用編

前回から随分と間が開いてしまった。Javaのジェネリクスはイレイジャ方式だけどもクラスにバインドした型の情報が残る場合があるんだよシリーズの第2弾である。具体的にどういう場合にバインドした型が残るのかという話だが、端的に列挙すると以下のものであ…

高階型変数のパラダイム分析

前稿 ジェネリクスのカリー化 - プログラマーの脳みそ では、Javaの内部クラスを利用して複数の型変数をもつジェネリックなクラスをカリー化することができるという話をした。では以前のJavaによる高階型変数の実装 - プログラマーの脳みそで用いた手法はカ…

ジェネリクスのカリー化

関数を扱えるだけでは、モナドを表現するには不十分過ぎる - xuwei-k's blogを見て、言語の型システムの表現力とその限界とはなんなんだろうということをモヤモヤと考えていた。ここで話題になっているのは型変数を持つ型変数という話題である。これを便宜的…

Javaのジェネリクスとリフレクション

今回のテーマはジェネリクスとリフレクション。Javaのジェネリクスはイレイジャ方式なのでリフレクションでは何も得られないと思ってはいまいか。 public void hoge(List<String> list) {} といったメソッドがあったとして、リフレクションでこのメソッドの情報を得</string>…

再帰ジェネリクスのthisとTの互換性

再帰ジェネリクスを用いて以下のようなコードを書いたとする。 Hogeを継承した型を作った場合に具象型を得るgetThis()メソッドを使えるようにしたいわけだ。 public class Hoge<T extends Hoge<T>> { @SuppressWarnings("unchecked") public T getThis() { return (T) this; } </t>…

ジェネリックな設計 再帰編

11/10に開催されたJJUG CCC 2012 Fallでジェネリクスについてセッションを行いました。このエントリはセッション内容を補足するものです。基礎的な内容はJavaジェネリクス再入門 - プログラマーの脳みそ ジェネリックな設計 基礎編 - プログラマーの脳みそな…

ジェネリックな設計 基礎編

11/10に開催されたJJUG CCC 2012 Fallでジェネリクスについてセッションを行いました。このエントリはセッション内容を補足するものです。本セッションはジェネリックなクラスの設計を行えるようになって欲しいという狙いで話をしました。ジェネリックなクラ…

ジェネリクスによるVisitorパターン拡張の考察

先日twitterで "Expression Problem" という問題を知った。 静的な型付けの下で、場合分けのデータ構造に対して、新しい場合分けとその場合に対する新しい処理を、元のソースコードに手を加えることなく拡張定義すること 2009-05-16 この問題が意図するとこ…

Semicolonless Java 2012

JavaOne Tokyo 2012でLTをしてきました。内容は寺田さんの要請でSemicolonless Java(セミコロンレス・ジャバ)です。当日は風邪で喉をやられたので音声が聞き取りにくかったと思います。申し訳ないです。公式のフォトライブラリーがあるので当日の会場の雰…

Java7 ジェネリクスのダイアモンド・オペレータ

Java 7がリリースされました。もう随分前から7の話題はあったものの、ずっと延期されてたんで出た事自体が不思議な気がしますが、皆様いかがお過ごしでしょうか。Java 6が2006年12月ですからほぼ5年も経ってしまったのですね。Java 7のリリースノートは Java…

Javaによる高階型変数の実装

高階関数というものをご存知か。関数自身を引数あるいは戻り値に取る関数のことである。「高階」は「こうかい」と読む。その昔「たかしな」と読んだ人がいたとか、いないとか。先のエントリ「HttpSessionを型安全にする」では「javax.servlet.http.HttpSessi…

HttpSessionを型安全にする

Servletをやった人はおなじみのjavax.servlet.http.HttpSessionのsetAttribute()/getAttribute()のようなモノをどうやって型安全にするかというのが今回のテーマ。擬似的にはjava.util.Map型へのput/getだと思ってもらっていい。通常、Mapを使う際はキーの型…

ジェネリクスの代入互換のカラクリ

Javaジェネリクス再入門 - プログラマーの脳みそでは、「変数の型の宣言」の項で「ジェネリクスの<>の中は一般のJavaの型の代入互換性とは異なる。このことはよく覚えておかなくてはいけない。」と言ったものの、深入りはしなかった。このあたりについて深入…

Javaジェネリクス再入門

ジェネリクスでは、「型」を変数にした「型変数」というものを取り扱う。型変数で何が嬉しいかというと、メジャーな例ではコレクションAPIが挙げられる。java.util.Listとかjava.util.Mapとかのデータを格納するタイプのユーティリティクラスのことだ。2004…

再帰的ジェネリクスの代入互換性

Javaのややこしいジェネリクスの話をしよう。*1 再帰的ジェネリクス クラスHogeがあったとして、型変数Tを取る。 public class Hoge<T> {} このHogeの型変数Tがextends Hogeとすると public class Hoge<T extends Hoge> {} すると、T extends Hoge の Hoge が raw型だと警告され</t></t>…

ジェネリクス型変数と型階層

@masaru_b_cl とジェネリクスの話をしていて、継承の際に型変数に具体的な型をバインドして単純化したりするんだよ、みたいな話をしていたのだけど、コード例がないとイメージしにくいと思うのでちょっと書いておこう。 二つの型変数 I, O をもつinterfaceが…

型に属する情報をジェネリックに扱う試み

Generics 勉強中 - しげっと! 妥協案 - しげっと! Integer.MAX_VALUE で Integer の最大値をとってくるみたいに、 // このソースはコンパイル通らないので参考にしないでね。 class Values <T> { private T max, min; public Values() { this.max = T.MAX_VAL</t>…