SlideShare ist ein Scribd-Unternehmen logo
1 von 36
Effective Java 輪読会
2013/01/08
開発部 田中
第5章 ジェネリックス
(項目26~29)
• 項目26
– ジェネリック型を使用する
ジェネリック化
• Stackクラス
– 互換性のために要素の型をObjectにしている
• 要素を取り出す際、クライアントでキャストが必
要

• Object型を仮型パラメータEで置き換える
ことで、クラスをジェネリック化(一般
化)する
• ジェネリック化により、コンパイル時に
型の検査を行う
ジェネリック配列生成の禁止
• Stackクラスでコンパイルエラーが発生
Public Stack() {
elements = new E[DEFAULT_INITIAL_CAPACITY];
}

– 仮型パラメータ、ジェネリック型は具象化不
可能クラス
• elementsはObject型で生成する
• どこでキャストするかが問題
適切な無検査警告の抑制
• パターン1

Objectの配列をキャストす
る

Public Stack() {
elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY];
}

– elementsはprivateフィールドであり、elements
追加される値の型はpushメソッドからのEのみ
適切な無検査警告の抑制
• パターン2
private Object[] elements;
Public Stack() {
elements = new Object[DEFAULT_INITIAL_CAPACITY];
}
public E pop() {
if (size == 0) {
throw new EmptyStackException();
}
E result = (E) elements[--size];
elements[size] = null;
return result;
要素を取り出すタイミングでキャ
スト
}
どちらの方法を採るべきか
• キャストの回数
– 要素を追加する毎にキャストよりも、配列ご
とキャストする方が回数は少ない

• キャストの危険性
– 配列型への無検査キャストを抑制する方が危
険
型パラメータに関する制約
• 基本的にはない

• プリミティブ型は、ボクシングされた基
本データ型を使う
境界型パラメータ
Class DelayQueue<E extends Delayed> implements BlockingQueue<E>;

• 型パラメータリストで、仮型パラメータ
を束縛する
– Bounded Type Parameters
– 実型パラメータがDelayedのサブタイプである
ことを強制する
– extendsによって、仮型パラメータの範囲(境
界)を定義
– すべての方は、それ自身のサブタイプ
• 項目27
– ジェネリックメソッドを使用する
論点
1. row型警告
2. ジェネリックシングルトンファクトリー
3. 再帰型境界
単純な例
• セットの要素がすべて同じ型であること
を強制する
public static <E> Set<E> union(Set<E> s1, Set<E> s2) {
Set<E> result = new HashSet<>(s1);
result.addAll(s2);
このEはどのように決まるの
return result;
か?
}

– 境界ワイルドカード型(Bounded Wildcard
Type)を使うことで、柔軟性を持たせること
もできる(→項目28)
ジェネリックシングルトンファク
トリー
• 論理的に型安全であることが確認できた
なら、無検査警告を抑制してもよい
– Ex. 恒等式
• 安全である論理的根拠は?
再帰型境界
• 型パラメータをその型パラメータ自身が
関係する何らかの式で制限する
– Ex. リスト中の最大値を返す関数の定義するた
めに、「相互比較可能」であることを表現し
たいとき
class static <T extends Comparable<T>> T max(List<T> list)
• extends Comparable?
• http://d.hatena.ne.jp/Nagise/20101101/1288629634
• 項目28
– APIの柔軟性向上のために境界ワイルドカード
を使用する
論点
1.
2.
? 3.
? 4.

境界ワイルドカードの必要性
上限境界と下限境界の使い分け
戻り値型にワイルドカードを使わない
ワイルドカード型をいつ使うか

? 5. ワイルドカード型を特定の型として捉え

たい
論点1
境界ワイルドカードの必要性
境界ワイルドカード
• ワイルドカードに制約を追加することで、
受け取れる型の範囲を柔軟に定義する
void pushAll(Iterable<? extends E> src) {
for (E e : src) {
push(e);
}
}

– ワイルドカードを使わない場合、
Iterable<Number>は、Number型しか受け取ら
ない(不変)
境界ワイルドカードが必要ない場
合
public interface Box<T> {
public T get();
public void put(T element);
}

– 『T 型の変数の観点で規定されており、T に対
するジェネリック型の観点で規定されている
わけではない』
境界ワイルドカードが必要な場
合
public interface Box<T> {
public T get();
public void put(T element);
public void put(Box<T> box);
}
Box<Number> nBox = new BoxImpl<Number>();
Box<Integer> iBox = new BoxImpl<Integer>();
nBox.put(iBox);

– Box<Number> に対する put(Box<Integer>) メソッド
が見つからない
– Integer は Number であって
も Box<Integer> は Box<Number> ではない
どうすればジェネリックになる
か
public interface Box<T> {
public T get();
public void put(T element);
public void put(Box<? extends T> box);
}

• ワイルドカードに上限境界を設ける
– 共変と不変(反変)との妥協案
論点2
上限境界と下限境界の使い分け
上限境界か下限境界か
• PECS
– パラメータ化された型がTプロデューサーを表
していれば、<? extends T>
– パラメータ化された型がTコンシューマーを表
していれば、<? super T>
論点3
戻り値としてのワイルドカード
型
戻り値型にワイルドカードは使わな

い
public static <E> Set<? Extends E>
union(Set<? extends E> s1, Set<? extends E> s2) {
:
}
public static void main(String[] args) {
:
Set<String> aflCio = union(guys, stooges);
Set<? extends String> aflCio = union(guys, stooges);
}

• ユーザーにワイルドカードを使わせるの
はAPIとして設計を誤っている
論点4
ワイルドカード型をいつ使うか
型パラメータとワイルドカード
public static <E> void swap(List<E> list, int i, int j);
public static void swap(List<?> list, int i, int j);

• どちらで定義するべきか
– 「単純で好ましい」(?)
– 「どのようなリストでも渡せる」(?)
論点5
ワイルドカード型を特定の型と
して捉えたい
互換性を検証できない
public interface Box<T> {
public T get();
public void put(T element);
}
public void rebox(Box<?> box) {
box.put(box.get());
}

• 「put() の実際のパラメーターの型が正式
なパラメーターの型と互換性があること
を検証できないため、put() を呼び出すこ
とはできない」
ワイルドカードキャプチャー
public interface Box<T> {
public T get();
public void put(T element);
}
public void rebox(Box<?> box) {
reboxHelper(box);
}
private <V> void reboxHelper(Box<V> box) {
box.put(box.get());
}

• V によって任意の未知の型も表すことができ
る
– 「名前を復活させる」
参考文献
• http://www.ibm.com/developerworks/jp/java
/library/j-jtp04298.html
• http://www.ibm.com/developerworks/jp/java
/library/j-jtp07018.html
• 項目29
– 型安全な異種コンテナーを検討する
論点
1. Classクラスがジェネリクス型であること
を利用して、異種コンテナーを実装する
– ネストされた非境界型パラメーター
– Class#typeによる動的キャスト
問題点1
• Favoritesインスタンスの型安全性が完全で
はない
問題点2
• 具象化不可能クラスを格納できない
– Classオブジェクトを取得できない

Weitere ähnliche Inhalte

Was ist angesagt?

PoisoningAttackSVM (ICMLreading2012)
PoisoningAttackSVM (ICMLreading2012)PoisoningAttackSVM (ICMLreading2012)
PoisoningAttackSVM (ICMLreading2012)Hidekazu Oiwa
 
"Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz...
"Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz..."Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz...
"Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz...nkazuki
 
Rの初歩: 2. ベクトル
Rの初歩:  2.  ベクトルRの初歩:  2.  ベクトル
Rの初歩: 2. ベクトルTeiko Suzuki
 
Prml5 6
Prml5 6Prml5 6
Prml5 6K5_sem
 
深層学習と活性化関数
深層学習と活性化関数深層学習と活性化関数
深層学習と活性化関数spade630
 
[第2版]Python機械学習プログラミング 第8章
[第2版]Python機械学習プログラミング 第8章[第2版]Python機械学習プログラミング 第8章
[第2版]Python機械学習プログラミング 第8章Haruki Eguchi
 
C++0x 言語の未来を語る
C++0x 言語の未来を語るC++0x 言語の未来を語る
C++0x 言語の未来を語るAkira Takahashi
 
Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築
Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築
Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築Tatsuya Tojima
 
Inference and Checking of Object Ownership
Inference  and  Checking  of  Object OwnershipInference  and  Checking  of  Object Ownership
Inference and Checking of Object OwnershipJiachen Yang
 
Chapter9 一歩進んだ文法(前半)
Chapter9 一歩進んだ文法(前半)Chapter9 一歩進んだ文法(前半)
Chapter9 一歩進んだ文法(前半)itoyan110
 
[DL輪読会]Flow-based Deep Generative Models
[DL輪読会]Flow-based Deep Generative Models[DL輪読会]Flow-based Deep Generative Models
[DL輪読会]Flow-based Deep Generative ModelsDeep Learning JP
 
科学技術計算関連Pythonパッケージの概要
科学技術計算関連Pythonパッケージの概要科学技術計算関連Pythonパッケージの概要
科学技術計算関連Pythonパッケージの概要Toshihiro Kamishima
 
「深層学習」勉強会LT資料 "Chainer使ってみた"
「深層学習」勉強会LT資料 "Chainer使ってみた"「深層学習」勉強会LT資料 "Chainer使ってみた"
「深層学習」勉強会LT資料 "Chainer使ってみた"Ken'ichi Matsui
 
UnityでC#を勉強しはじめた私の主張
UnityでC#を勉強しはじめた私の主張UnityでC#を勉強しはじめた私の主張
UnityでC#を勉強しはじめた私の主張Ryota Murohoshi
 
実行トレース間のデータの差異に基づくデータフロー解析手法の提案
実行トレース間のデータの差異に基づくデータフロー解析手法の提案実行トレース間のデータの差異に基づくデータフロー解析手法の提案
実行トレース間のデータの差異に基づくデータフロー解析手法の提案Kamiya Toshihiro
 

Was ist angesagt? (20)

PoisoningAttackSVM (ICMLreading2012)
PoisoningAttackSVM (ICMLreading2012)PoisoningAttackSVM (ICMLreading2012)
PoisoningAttackSVM (ICMLreading2012)
 
NLPforml5
NLPforml5NLPforml5
NLPforml5
 
W8PRML5.1-5.3
W8PRML5.1-5.3W8PRML5.1-5.3
W8PRML5.1-5.3
 
"Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz...
"Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz..."Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz...
"Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz...
 
Rの初歩: 2. ベクトル
Rの初歩:  2.  ベクトルRの初歩:  2.  ベクトル
Rの初歩: 2. ベクトル
 
Prml5 6
Prml5 6Prml5 6
Prml5 6
 
深層学習と活性化関数
深層学習と活性化関数深層学習と活性化関数
深層学習と活性化関数
 
[第2版]Python機械学習プログラミング 第8章
[第2版]Python機械学習プログラミング 第8章[第2版]Python機械学習プログラミング 第8章
[第2版]Python機械学習プログラミング 第8章
 
C++0x 言語の未来を語る
C++0x 言語の未来を語るC++0x 言語の未来を語る
C++0x 言語の未来を語る
 
Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築
Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築
Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築
 
Inference and Checking of Object Ownership
Inference  and  Checking  of  Object OwnershipInference  and  Checking  of  Object Ownership
Inference and Checking of Object Ownership
 
PRML chapter5
PRML chapter5PRML chapter5
PRML chapter5
 
Chapter9 一歩進んだ文法(前半)
Chapter9 一歩進んだ文法(前半)Chapter9 一歩進んだ文法(前半)
Chapter9 一歩進んだ文法(前半)
 
[DL輪読会]Flow-based Deep Generative Models
[DL輪読会]Flow-based Deep Generative Models[DL輪読会]Flow-based Deep Generative Models
[DL輪読会]Flow-based Deep Generative Models
 
科学技術計算関連Pythonパッケージの概要
科学技術計算関連Pythonパッケージの概要科学技術計算関連Pythonパッケージの概要
科学技術計算関連Pythonパッケージの概要
 
「深層学習」勉強会LT資料 "Chainer使ってみた"
「深層学習」勉強会LT資料 "Chainer使ってみた"「深層学習」勉強会LT資料 "Chainer使ってみた"
「深層学習」勉強会LT資料 "Chainer使ってみた"
 
PRML 5.3-5.4
PRML 5.3-5.4PRML 5.3-5.4
PRML 5.3-5.4
 
UnityでC#を勉強しはじめた私の主張
UnityでC#を勉強しはじめた私の主張UnityでC#を勉強しはじめた私の主張
UnityでC#を勉強しはじめた私の主張
 
Prml 3 3.3
Prml 3 3.3Prml 3 3.3
Prml 3 3.3
 
実行トレース間のデータの差異に基づくデータフロー解析手法の提案
実行トレース間のデータの差異に基づくデータフロー解析手法の提案実行トレース間のデータの差異に基づくデータフロー解析手法の提案
実行トレース間のデータの差異に基づくデータフロー解析手法の提案
 

Mehr von Appresso Engineering Team

マルチスレッド デザインパターン ― Single Threaded Execution
マルチスレッド デザインパターン ― Single Threaded Executionマルチスレッド デザインパターン ― Single Threaded Execution
マルチスレッド デザインパターン ― Single Threaded ExecutionAppresso Engineering Team
 
JavaScript 勉強会 ― 変数・演算子・文
JavaScript 勉強会 ― 変数・演算子・文JavaScript 勉強会 ― 変数・演算子・文
JavaScript 勉強会 ― 変数・演算子・文Appresso Engineering Team
 
Effective Java 輪読会 第7章 項目43-44
Effective Java 輪読会 第7章 項目43-44Effective Java 輪読会 第7章 項目43-44
Effective Java 輪読会 第7章 項目43-44Appresso Engineering Team
 
Effective Java 輪読会 第7章 項目41-42
Effective Java 輪読会 第7章 項目41-42Effective Java 輪読会 第7章 項目41-42
Effective Java 輪読会 第7章 項目41-42Appresso Engineering Team
 
Effective Java 輪読会 第7章 項目38-40
Effective Java 輪読会 第7章 項目38-40Effective Java 輪読会 第7章 項目38-40
Effective Java 輪読会 第7章 項目38-40Appresso Engineering Team
 
Effective Java 輪読会 第6章 項目35-37
Effective Java 輪読会 第6章 項目35-37Effective Java 輪読会 第6章 項目35-37
Effective Java 輪読会 第6章 項目35-37Appresso Engineering Team
 

Mehr von Appresso Engineering Team (20)

20150302 java8 第一回_ラムダ式(1)
20150302 java8 第一回_ラムダ式(1)20150302 java8 第一回_ラムダ式(1)
20150302 java8 第一回_ラムダ式(1)
 
Effective Java 輪読会 項目77-78
Effective Java 輪読会 項目77-78Effective Java 輪読会 項目77-78
Effective Java 輪読会 項目77-78
 
Effective Java 輪読会 項目74-75
Effective Java 輪読会 項目74-75Effective Java 輪読会 項目74-75
Effective Java 輪読会 項目74-75
 
マルチスレッド デザインパターン ― Single Threaded Execution
マルチスレッド デザインパターン ― Single Threaded Executionマルチスレッド デザインパターン ― Single Threaded Execution
マルチスレッド デザインパターン ― Single Threaded Execution
 
JavaScript 勉強会 ― 変数・演算子・文
JavaScript 勉強会 ― 変数・演算子・文JavaScript 勉強会 ― 変数・演算子・文
JavaScript 勉強会 ― 変数・演算子・文
 
JavaScript 勉強会 ― 型と値
JavaScript 勉強会 ― 型と値JavaScript 勉強会 ― 型と値
JavaScript 勉強会 ― 型と値
 
Effective Java 輪読会 項目69-70追加
Effective Java 輪読会 項目69-70追加Effective Java 輪読会 項目69-70追加
Effective Java 輪読会 項目69-70追加
 
Effective Java 輪読会 項目69-70
Effective Java 輪読会 項目69-70Effective Java 輪読会 項目69-70
Effective Java 輪読会 項目69-70
 
Effective Java 輪読会 項目66-68
Effective Java 輪読会 項目66-68Effective Java 輪読会 項目66-68
Effective Java 輪読会 項目66-68
 
Effective Java 輪読会 項目71-73
Effective Java 輪読会 項目71-73Effective Java 輪読会 項目71-73
Effective Java 輪読会 項目71-73
 
Java Day Tokyo 2014 まとめ (chen)
Java Day Tokyo 2014 まとめ (chen)Java Day Tokyo 2014 まとめ (chen)
Java Day Tokyo 2014 まとめ (chen)
 
Effective Java 輪読会 項目63-65
Effective Java 輪読会 項目63-65Effective Java 輪読会 項目63-65
Effective Java 輪読会 項目63-65
 
Effective Java 輪読会 項目60-62
Effective Java 輪読会 項目60-62Effective Java 輪読会 項目60-62
Effective Java 輪読会 項目60-62
 
Effective java 輪読会 項目57-59
Effective java 輪読会 項目57-59Effective java 輪読会 項目57-59
Effective java 輪読会 項目57-59
 
Effective Java 輪読会 項目45-48
Effective Java 輪読会 項目45-48Effective Java 輪読会 項目45-48
Effective Java 輪読会 項目45-48
 
Effective Java 輪読会 項目53-56
Effective Java 輪読会 項目53-56Effective Java 輪読会 項目53-56
Effective Java 輪読会 項目53-56
 
Effective Java 輪読会 第7章 項目43-44
Effective Java 輪読会 第7章 項目43-44Effective Java 輪読会 第7章 項目43-44
Effective Java 輪読会 第7章 項目43-44
 
Effective Java 輪読会 第7章 項目41-42
Effective Java 輪読会 第7章 項目41-42Effective Java 輪読会 第7章 項目41-42
Effective Java 輪読会 第7章 項目41-42
 
Effective Java 輪読会 第7章 項目38-40
Effective Java 輪読会 第7章 項目38-40Effective Java 輪読会 第7章 項目38-40
Effective Java 輪読会 第7章 項目38-40
 
Effective Java 輪読会 第6章 項目35-37
Effective Java 輪読会 第6章 項目35-37Effective Java 輪読会 第6章 項目35-37
Effective Java 輪読会 第6章 項目35-37
 

Kürzlich hochgeladen

IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdffurutsuka
 

Kürzlich hochgeladen (7)

IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
 

Effective java 輪読会 第5章 項目26-29