言語仕様

ボクシングする方法あれこれ

動機 プリミティブ型の式(たとえば数値リテラル)はオブジェクトではないので、メソッドを呼び出すことはできません。 // コンパイルエラー 100.intValue(); そこで簡単な式でボクシング変換を起こす方法をいくつか紹介します。 たとえばメソッドチェイン中で…

アンボクシングのち拡大変換

変数に値を代入する際に、アンボクシング→プリミティブ拡大変換は起こる*1が プリミティブ拡大変換→ボクシングは起こらないので、 intはLongになるがIntegerはlongにならない。 @SuppressWarnings("unused") public static void main(final String[] args) {…

仮型引数に実型引数を「渡す」と何が起こるか

概要 ジェネリッククラス/インターフェースに実型引数を与えた際のメンバの型の仕様 http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.5.2 の勉強。よく分かっていない 本文 仮型引数に実型引数を「渡す」ことはinvocationでした。→ 実型…

null typeって何

概要 null typeをちゃんと読む 仕様 Java言語仕様にはnull typeがあります。 There is also a special null type, the type of the expression null (§3.10.7, §15.8.1), which has no name. http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#j…

intersection typeと型変数のupper bound

言語仕様にintersection typeは型変数のupper boundと似ているが、違うと書いてあるのでメモ。 型変数のupper boundはintersection typeをもたらすが、intersection typeの方がより広いものを含むということらしい。 An intersection type takes the form T1…

実型引数を仮型引数に「渡す」

先日のエントリー 仮型引数と実型引数の混同に関する考察 で仮型引数 (type parameter) と実型引数 (type argument) の話をしました。 では、実型引数を仮型引数に「渡す」ことは仕様では何と呼ぶのでしょうか。 The type argument list denotes a particula…

仮型引数と実型引数の混同に関する考察

Javaジェネリクス初心者は と Hoge>の違いが分からない! とよく混乱します。前者はtype parameter*1として、後者はtype argumentとして使われる表現で、出てくる文脈が違うものです。では、なぜこの2つは混同されるのでしょうか? 一つの原因はどちらも<>と…

見えなくても型はついている

private(package private、protectedでも可能)メンバクラスをそれよりも可視性の高いアクセス修飾子をもつメソッドの戻り値型や引数型にすると、使う側で「何だこの型は?」という不思議なメソッド*1になる。簡単な実験で、スーパークラスやインターフェース…

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…

共変戻り値型に使えるワイルドカード

clone()の戻り値型は、共変戻り値型 (covariant return type) が使えることを利用して、定義されたクラスの型にするのがよいとされている。参考: http://www.ne.jp/asahi/hishidama/home/tech/java/clone.html#h2_covariantでは、コピーをリストで複数返した…

void配列はありません

Javaでよく遊んでいるのでメモ。 void.classが取れるならvoid[].classも取れるのでは?と思ったが取れなかった。 リフレクションでもvoid配列は作れなかった。 package test; import java.lang.reflect.Array; public class VoidArrayTest { public static v…

letで束縛とはこれいかに

概要 Coqの些末な話。 proj2_sigの定義が読めなかったのでletについて調べた。 (* proj2_sig = fun (A : Type) (P : A -> Prop) (e : sig P) => let (a, b) as e0 return (P (proj1_sig e0)) := e in b : forall (A : Type) (P : A -> Prop) (e : sig P), P …