読書会(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 じゃないとおかしい


[ 戻る ]