2008/09/20 ジェネリクスを使おう! 凪瀬悠輝(なぎせゆうき).

Slides:



Advertisements
Similar presentations
アルゴリズムとプログラミン グ (Algorithms and Programming) 第6回:クラスとインスタンス クラスの宣言 アクセス修飾子 インスタンスの生成 (new キーワード) this キーワード フィールドとメソッドの実際の定義と使い 方 クラスの宣言 アクセス修飾子 インスタンスの生成.
Advertisements

1 C++ における OOP を用いた 書き方講座 H 山崎貴英. 2 今回の内容 OOP とは? C++ の超基礎 注釈 書いてあるコードはすべて一部抜粋。 コピペだと動かないよ!
オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
独習JAVA Chapter 6 6.6 クラスの修飾子 6.7 変数の修飾子 結城 隆. 6.6 クラスの修飾 abstract インスタンス化できないクラス。1つまたは複数のサブクラスで 実装してはじめてインスタンス化できる。 final 継承されたくないことを明示する。これ以上機能拡張 / 変更でき.
Scala + Lift フレームワーク. Scala の概要 JVM 上で動作するオブジェクト指向+関数型言 語 JVM のスケーラビリティを適用できる Java との相互利用が可能 trait を利用した多重継承( Mix-In )が可能.
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
Applet 岡部 祐典 鈴木 敬幸.
~手続き指向からオブジェクト指向へ(Ⅰ)~
プログラミング基礎I(再) 山元進.
Javaのための暗黙的に型定義される構造体
第5回 iPhoneアプリ開発勉強会 Objective-C 「継承とクラス」
アルゴリズムとデータ構造1 2007年6月12日
実行時のメモリ構造(1) Jasminの基礎とフレーム内動作
情報伝播によるオブジェクト指向プログラム理解支援の提案
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
独習Java ・ 10.6  Hashtableクラス ・ 10.7  String Tokenizerクラス  12月12日    小笠原 一恵.
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
アルゴリズムとプログラミング (Algorithms and Programming)
繰り返し プログラミング 第4回 繰り返し プログラミング第4回.
社会人学習講座 「Javaプログラミング概論」
Bridge Pattern
オブジェクト指向入門.
アルゴリズムとデータ構造 2011年6月20日
第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀.
第13回 ハッシュテーブルを使ったプログラム ~高速に検索するには?~.
変数のスコープ クラス クラス変数 すべてのメソッドの外側でstaticで定義
アルゴリズムとプログラミング (Algorithms and Programming)
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
第7回独習Javaゼミ セクション 1~4 発表者 直江 宗紀.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
静的型付きオブジェクト指向言語 のための 暗黙的に型定義されるレコード
暗黙的に型付けされる構造体の Java言語への導入
ポインタ解析におけるライブラリの スタブコードへの置換の効果
第11週:super/subクラス、継承性、メソッド再定義
C#言語ソースプログラムの原型 C言語 C#言語 Hello World! Hello Students! オマジナイ! 適当なクラス名
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
計算機プログラミングI 第5回 配列 文字列(Stringクラス) mainの引数 配列の利用例
オブジェクト・プログラミング 第8回.
独習Java ・ 5.7  静的変数と静的メソッド ・ 5.8  ローカル変数と変数のスコープ  11月20日    小笠原 一恵.
アルゴリズムとプログラミング (Algorithms and Programming)
オブジェクト指向 プログラミング 第九回 知能情報学部 新田直也.
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
Boostのスマートなポインタを使ってみる
C#プログラミング実習 第3回.
JAVA入門③ 配列とコレクション.
アルゴリズムとプログラミング (Algorithms and Programming)
コレクション・フレームワーク J2EE I (データベース論) 第6回 /
コレクション・フレームワーク データベース論 第7回.
サブゼミ第7回 実装編① オブジェクト型とキャスト.
ソフトウェア制作論 平成30年11月28日.
2008/09/20 ジェネリクスを使おう! 凪瀬悠輝(なぎせゆうき).
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
アルゴリズムとデータ構造 2012年6月21日
フレンド関数とフレンド演算子.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
値渡しと参照渡しについて.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

2008/09/20 ジェネリクスを使おう! 凪瀬悠輝(なぎせゆうき)

List<String> list = new ArrayList<String>(); 2008/09/20 簡単なジェネリクス List<String> list = new ArrayList<String>();

データの集合を表すクラスで、データの型をジ ェネリクスで表現する使い方 一番分かりやすい なじみ深い 序の口 2008/09/20 コレクションとしてのジェネリクス List<T>とか Map<K, V>とか データの集合を表すクラスで、データの型をジ ェネリクスで表現する使い方 一番分かりやすい なじみ深い 序の口

public class Hoge<T> { public T value; } 型変数はインスタンス化の際に型をバインド 2008/09/20 ジェネリックなクラスを作る Class宣言の横に型変数を宣言する 変数宣言時に型変数を使えるようになる public class Hoge<T> { public T value; } 型変数はインスタンス化の際に型をバインド Hoge<String> hoge = new Hoge<String>(); hoge.value = “hoge”; String str = hoge.value;

例えばResult<T>という型を考える /** 処理結果のラッパークラス */ 2008/09/20 ラッパークラスとしてのジェネリクス 例えばResult<T>という型を考える /** 処理結果のラッパークラス */ public class Result<T> { public T value; public Status status; public String errorMessage; }

public class StringList extends ArrayList<String> { … } 2008/09/20 ジェネリックなクラスの継承 継承の際に型変数に型をバインドする public class StringList extends ArrayList<String> { … } 型変数に型変数をバインドするケース public class HogeList<A, B, C> extends ArrayList<B> { … }

public class Hoge<T extends B> { … } 2008/09/20 型変数の境界 型変数は宣言する時に境界を設定できる public class Hoge<T extends B> { … } C extends B、 B extends A のとき new Hoge<A>(); // NG new Hoge<B>(); // OK new Hoge<C>(); // OK

public class Piyo<T super B> { … } C extends B、 B extends A のとき 2008/09/20 型変数の境界 その2 ある型階層より上という指定の仕方 public class Piyo<T super B> { … } C extends B、 B extends A のとき new Piyo<A>(); // OK new Piyo<B>(); // OK new Piyo<C>(); // NG

public class Foo<T extends C & I> { … } クラス C を継承して、且つ、 2008/09/20 型変数の境界 その3 public class Foo<T extends C & I> { … } クラス C を継承して、且つ、 インターフェース I を継承する型のみを 型変数Tにバインドすることができる。

List<? extends B> extendsList; List<? super B> superList; 2008/09/20 ワイルドカード 今度は型変数にバインドする型引数の話 型引数にはワイルドカードが使用できる List<?> list; List<? extends B> extendsList; List<? super B> superList;

集合の代入になるのでOOP的代入と異なる 2008/09/20 代入互換性 集合の代入になるのでOOP的代入と異なる List<B> listB = new ArrayList<C>(); // NG なぜかというと、listB.add(new B()); とするとArrayList<C>にB型が add()されてしまうから。

List<? extends B>の範囲 2008/09/20 代入互換性 その2 List<? extends B>の範囲 List<? super B>の範囲

List<? extends B>型に 2008/09/20 代入互換性 その3 List<? extends B>型に List<B>が代入可能 List<C>が代入可能 List<? super B>型に List<A>が代入可能

List<? extends B>にはadd()できない ArrayList<C>型を代入 B型をadd()とする 2008/09/20 ワイルドカード使用時の引数の制限 List<? extends B>にはadd()できない ArrayList<C>型を代入 B型をadd()とする List<C>にB型がadd()される ←矛盾

List<? super B>にはB型をadd()できる 2008/09/20 ワイルドカード使用時の引数の制限 その2 List<? super B>にはB型をadd()できる List<? super B>に代入可能なList<A>は B型をadd()しても大丈夫

List<? extends B>からはB型をget()できる B b = list.get(0); 2008/09/20 ワイルドカード使用時の戻り値の制限 List<? extends B>からはB型をget()できる B b = list.get(0); List<? super B>からは Object型でしかget()できない Object o = list.get(0); List<A>とかが代入されてるかもしれないから