今月の写真

移動

サイト内検索

BGM



月別アーカイブ

Powered by

このページはコメント投稿用に一時的に作成された物です。リンクは固定リンクURLにお願いします。

2009年7月13日

F-subとJavaのGenerics

今回はちょっと難しい話を…。たぶんこれだけ読んでも意味不明です。

この前まで輪講で Types and Programming Languages を読んでいて、やっと輪講が終わりました。終わったと言っても、26章 Bounded Quantification までしか読んでいませんが。我々は型理論の専門家ではないので、この辺までで良いだろうという流れです。

26章は、Java の Generics でお馴染みのF-sub(F<:)が出てきます。汎用的な関数を作るときに、サブタイプだけだと、あるタイプのサブタイプを適用すると、型情報が落ちてしまいます。ポリモーフィズム(OOPで一般的なサブタイプポリモーフィズムではなくパラメトリックポリモーフィズム)を使うと、型変数にどんな型をも適用できるようになってしまうので、型エラーになってしまう場合がある。そこで、適用できる型の範囲を制限できるようにしようというのが、F-sub です。

Javaでいうと、Genericsを使えば、ArrayListなどからgetするときに、型キャストが要らなくなる…ということの理論的な話です。

この章では、Full F-subというのが出てきて、


if S1 <: T1 and S2 :> T2 then
∀X<:S1. S2 :> ∀X<:T1. T2

となります。さっきから出てきている<:は、T<:STSのサブタイプであるという関係を表します。S1T1の関係が直観に反しているのは、クロージャの引数の型(∀Xは型を引数に取るクロージャの型)と同じだと本文にも書かれています。

さて、ここからは自分の勘違いの話です。

このFull F-subを読んで、何を考えたのか Java の Generics のワイルドカード「?」を思い浮かべてしまい、
JComponent :> JButton
なので、Full F-sub のルールに従うと、
ArrayList<? extends JComponent> <: ArrayList<? extends JButton>
であり、次のコードの (2) がOKで(1)がエラーになるはずなのでは?と考えてしまったのです。 (数時間悩みました)


ArrayList<? extends JComponent> list1 = ...;
ArrayList<? extends JButton> list2 = ...;

list1 = list2; //(1) OK
list2 = list1; //(2) エラー

勘違いの話はここで終わり。そもそも、Java でF-subの話を持ってくるなら、クラス定義の次のコードです。


class MyList<T extends JComponent> {
	:
}

そもそも MyList<JButton> list3; は何であったかというと、 これは ∀T<:JComponent. MyList 型を持つ値にJButtonという型を適用した型を持つlistという変数の宣言でした。

では、ワイルドカード「?」はというと、
MyList<? extends JComponent> list4;
MyListの型変数にJComponentの任意のサブクラスの型を適用した型でした。(厳密な説明ではありませんが)

よって、MyList<? extends JButton>MyList<JButton>MyList<? extends JButton>のスーパータイプになっているようです。なので(1)のような代入ができるわけです。(Javaでのサブクラスとサブタイプの違いの1つの例ですね)

ArrayList<? extends JButton>をF-subの話に関連づけるのであれば、F-subでの戻り値の型のサブタイプ関係に基づいている…と考えなければいけなかったようです。

これが原因で、Genericsのことを色々調べたので、今度まとめてみようかな…。

Types and Programming Languages
Benjamin C. Pierce

Types and Programming Languages

Mit Pr 2002-02-01
売り上げランキング : 7904
おすすめ平均 star
star 型理論の入門に手ごろな一冊
Amazonで詳しく見る

by G-Tools

23:58

このエントリーの固定リンクURL:
http://www.functiont.info/diary/200907.html#000125

トラックバック

このエントリーのトラックバックURL:
http://www.functiont.info/mt/mt-tb.cgi/124

コメント


コメントしてください




保存しますか?

new moon

Lia*COLLECTION ALBUM Vol.1 「Diamond Days」

RICOH R10

電子水準器搭載。
広角レンズ+1cm接写&光学7.1倍ズームで近くも遠くも!!

openSUSE 10.3 ビギナーズバイブル
まえだ ひさこ
大津 真