読書会(Java言語仕様 第3版)第2回議事録
[ 戻る ]
「Java 言語仕様第3版」を読む会第二回
参加者 (敬称略):
高橋(徹), 村上, 村山, 高橋(智), 遠藤, 奥野, 橋爪, 吉本,
小棚木, 松井, 大森, 岩室, 和田, 根本, 野元,
書記:
岡澤
読み手:
高橋(智)さん, 松井さん, 岩室さん
範囲:
(4.3 参照型とその値) から (5.6 数値の格上げ) まで
次回:
第6章 名前から
4.3 参照型とその値
4.3.1 オブジェクト
クラス・インスタンス (class instance)
クラスのインスタンス ... ではない
クラス型のインスタンス ... でもない
任意のクラスをインスタンス化したインスタンスのこと
(クラスから生成されたことを特定したいのではないか)
基本型の + では裏でなにが起きてるか ?
StringBuffer の append が使われているのだろう
StringBuffer,StringBuilder のどちらを使うかはコンパイラ次第
逆コンパイルすれば分かる
→ 宿題: 基本型を + してるコードを逆コンパイルしたらどうなる ?
JDK 1.6 で実験
StringBuilder だった
ロックが保持されている ?
ぶっちゃけ Mutex を持ってるというだけでは
4.3.2 クラス Object
Object クラスのことです
|T| の絶対値みたいな記号
53 ページで説明されている
Object.getClass() を特別扱いしなければならない理由は ?
e.getClass() は e の実行時に使用されているオブジェクトの型だから
インターフェース型のときのことまで含まれてる
4.3.3 クラス String
とくになし
4.3.4 参照型が同じである場合
バイナリ名 (13.1) って何 ?
完全限定名 ... とは少し違う
Tomcat などで ClassCastException に出てくるもの ?
4.4 型変数:
境界
& の前にはクラス型や型変数しか指定できない
& の前のクラス型や型変数によって型のイレイジャが決定される
& の後にはインターフェース型だけ
型変数が同時に ...
なんのこと ?
これが駄目だということ
<T extneds C & List<String> & List<Integer>>
~ ~~~~~~~~~~~~ ~~~~~~~~~~~~~
型変数 パラメータ化型 パラメータ化型
境界の後の List<..> はどちらもイレイジャで List になる
ジェネリックを使い倒したコードはあるのだろうか
Collection API の中にはあるのでは
4.5 パラメータ化型:
A <: B ってなに ?
型 A が型 B のサブクラスでないといけないということ ?
59 ページ (サブタイプ) に書いてある
P=G<Ti...Tn> は P=G<T1...Tn> ではないか ?
原書は T1 なので翻訳時の誤記
サポートページに正誤表がある
異なったジェネリック型宣言の起動である
起動 ?
別のものという意図だろうか
4.5.1 型引き数とワイルドカード
4.5.1.1 型引数の包含と等価性
正誤表に記載がある
2 つ目の 「T <: S」 は 「S <: T」
4.5.2 パラメータ化型におけるメンバとコンストラクタ
4.6 型のイレイジャ
4.7 具象化可能型
ジェネリック型は具象化可能としない
移行可能性を実現するため
RMI など古い JDK に影響はないのか
サーバ側はジェネリックを使って,クライアント側は使ってないなど
インターフェースが一致しない場合
実験する
問題になった,という話を聞いたことがない
バイトコード上にはジェネリックの影響が現れないため影響はない
シリアライズ前後にも影響しないはず
4.8 未加工型
4.9 共通型
4.10 サブタイピング
A < B
A は厳密な意味における B のサブタイプ
4.10.1 プリミティブ型におけるサブタイピング
float >1 long は直接のサブタイプとしていいのか ?
float -> long のキャストは可能 (警告なし)
パズラーのためにある仕様 ?
double >2 long という書き方をしないのか ?
直接かそうでないかのために >1 と書いているはず
直接でなければ :> になるか
>1 >1 と二回書くとか
4.10.2 クラスやインターフェース型におけるサブタイピング
theta (シータ)
4.10.3 配列型におけるサブタイピング
Cloneable は java.lang.Cloneable ?
Object も同様
Cloneable の設計は間違っていると前から言われている
スペルがちがう
public な clone メソッドが無い
非チェック例外を投げる
4.11 型を使用する場所
T が使われてない
宣言の例だからか ?
4.12 変数
4.12.1 プリミティブ型の変数
4.12.2 参照型の変数
4.12.3 変数の種類
インターフェース宣言中で ...
インターフェース内で宣言されたフィールドは必ず public static final となる
236 ページに記載「暗黙の内に public static final となる」
4.12.4 final 変数
4.12.5 変数の初期値
4.12.6 型,クラス,インターフェース
第五章 変換と格上げ
5.1 変換の種類:
5.1.1 恒等変換
5.1.2 プリミティブ型のワイドニング変換
5.1.3 プリミティブ型のナローイング変換
5.1.4 プリミティブ型のワイドニング変換
5.1.5 参照型のワイドニング変換
5.1.6 参照型のナローイング変換
5.1.7 ボクシング変換
ラッパークラスのインスタンスを作るとき,new せずにクラスメソッドを使うと,キャッシュされたインスタンスが得られる
コードを逆コンパイルすれば分かる
5.1.8 アンボクシング変換
NullPointerException がスローされる
JVM がスローする
5.1.9 未チェック変換
コンパイルオプションで SuppressWarnings を指定できるか
当初 SuppressWarnings が利かないことがあった
指定できない -> アノテーションは必須
-source 1.4 すれば出ない
5.1.10 捕捉変換
List<T>,List<?>
API はワイルドカードで公開したい
実装には型が必要
型変数を API にすると,実装に関する情報が漏れてしまう
捕捉変換によって,ワイルドカードの型を既知の型にできるようにする
List<?> から List<T> へ
単純にワイルドカードを型変数に代入可能とすると,型システムが壊れてしまう (fill メソッドの例)
Types and Programming Languages
http://www.amazon.co.jp/dp/0262162091
赤レンガの本
5.1.11 文字列変換
5.1.12 禁止されている変換
5.1.13 数値集合変換
VM と コンパイラのどちらが実装するものか ?
VM が実装する
定数式を計算するときはコンパイラも FP-Strict
拡張浮動小数点
丸めないで厳格に計算する
FP-Strict の環境
外に出るときや戻ってくるとき,丸めが起きてしまう
gcc のオプションには MMX を使うとか使わないとかのオプションがある
5.2 代入変換
5.3 メソッド起動変換
5.4 文字列変換
5.5 キャスト変換
5.6 数値の格上げ
99 ページ
「int:float が float:float に格上げされる」の次行
4.0f ではなく i じゃないとおかしい
[ 戻る ]