SlideShare a Scribd company logo
© 2022 NTT DATA Corporation
コレクションフレームワーク関連セッション
JavaOne & Devoxx報告会 2022
株式会社NTTデータ 阪田 浩一
2022年11月11日
• 想定視聴者: Javaのコレクションフレームワークのクラスを使ったことがあればどなたもOK!
© 2022 NTT DATA Corporation 2
自己紹介
• 株式会社NTTデータ 所属
• JVMがとにかく好き
• JavaOne 2015から毎回参加
• Javaチャンピオン
• OpenJDK Author
• 通算パッチ 10数個
• Oracle ACE Pro (Java分野)
Koichi Sakata
阪田 浩一
jyukutyo
© 2022 NTT DATA Corporation 3
このセッションで話すこと
 コレクションフレームワークが関係する2セッション
© 2022 NTT DATA Corporation 4
このセッションで話すこと
 コレクションフレームワークが関係する2セッション
• Sequenced Collections [LRN1422]
• The Sincerest Form of Flattery [LRN1426]
© 2022 NTT DATA Corporation 5
Sequenced Collections
[LRN1422]
© 2022 NTT DATA Corporation 6
JEP 431: Sequenced Collections
 https://openjdk.org/jeps/431
 順序ありのコレクションを定義するインタフェースを追加する
© 2022 NTT DATA Corporation 7
JEP 431: Sequenced Collections
 https://openjdk.org/jeps/431
 順序ありのコレクションを定義するインタフェースを追加する
 APIを2つ追加する
• コレクションの最初、最後の要素を取得する統一的なAPI
• 順序を逆にする統一的なAPI
© 2022 NTT DATA Corporation 8
JEP 431: Sequenced Collections
 https://openjdk.org/jeps/431
 順序ありのコレクションを定義するインタフェースを追加する
 APIを2つ追加する
• コレクションの最初、最後の要素を取得する統一的なAPI
• 順序を逆にする統一的なAPI
 このJEPはCandidateステータスのため
ドラフト実装をもとにディスカッション中
• https://github.com/openjdk/jdk/pull/7387
© 2022 NTT DATA Corporation 9
スピーカー
 Stuart Marksさん
 Oracle社の方
 このJEP 431のオーナー
 IDEでのコードを使った説明のみのためスライドはなし
• 記憶に加え JEPの記述とドラフトPRのコードを元にレポートします
© 2022 NTT DATA Corporation 10
コレクションフレームワークの課題
 順序ありコレクションとしてListとDequeがあるが
共通のインタフェースはCollectionで順序なしになる
 順序ありのコレクションを表すのに この2つは具体的過ぎる
© 2022 NTT DATA Corporation 11
コレクションフレームワークの課題
 順序ありコレクションとしてListとDequeがあるが
共通のインタフェースはCollectionで順序なしになる
 順序ありのコレクションを表すのに この2つは具体的過ぎる
 Setを例に挙げると SetとHashSetは順序なし
LinkedHashSetとSortedSetは順序あり
使いづらい わかりづらい
加えてunmodifiableSet()すると順序は失われる
© 2022 NTT DATA Corporation 12
コレクションフレームワークの課題
 順序ありコレクションとしてListとDequeがあるが
共通のインタフェースはCollectionで順序なしになる
 順序ありのコレクションを表すのに この2つは具体的過ぎる
 Setを例に挙げると SetとHashSetは順序なし
LinkedHashSetとSortedSetは順序あり
使いづらい わかりづらい
加えてunmodifiableSet()すると順序は失われる
 最初と最後の要素を取得する操作に統一性がない
 降順(逆順)で反復する操作に統一性がない
© 2022 NTT DATA Corporation 13
最初と最後の要素を取得する操作に統一性がない
型 最初の要素取得 最後の要素取得
List list.get(0) list.get(list.size()- 1)
Deque deque.getFirst() deque.getLast()
SortedSet sortedSet.first() sortedSet.last()
LinkedHashSet
linkedHashSet.iterator()
.next()
なし
© 2022 NTT DATA Corporation 14
降順で反復する操作に統一性がない
// NavigableSetだとdescendingSet()で降順のビューを取得できる
for (var e : navSet.descendingSet())
process(e);
// Dequeは降順イテレータが使える
for (var it = deque.descendingIterator(); it.hasNext();) {
var e = it.next();
process(e);
}
// ListだとListIteratorを使う
for (var it = list.listIterator(list.size()); it.hasPrevious();) {
var e = it.previous();
process(e);
}
// LinkedHashSetだと他のコレクションクラスにコピーするしかない
© 2022 NTT DATA Corporation 15
降順で反復する操作に統一性がない
// NavigableSetだとdescendingSet()で降順のビューを取得できる
for (var e : navSet.descendingSet())
process(e);
// Dequeは降順イテレータが使える
for (var it = deque.descendingIterator(); it.hasNext();) {
var e = it.next();
process(e);
}
// ListだとListIteratorを使う
for (var it = list.listIterator(list.size()); it.hasPrevious();) {
var e = it.previous();
process(e);
}
// LinkedHashSetだと他のコレクションクラスにコピーするしかない
加えてSetが返ってくるから
stream()を呼んで
Stream APIを使うことも
IteratorからStream取得は
Spliteratorsに渡して…
と手間がかかる
© 2022 NTT DATA Corporation 16
新しいインタフェースの導入
https://openjdk.org/jeps/431
© 2022 NTT DATA Corporation 17
SequencedCollectionインタフェース
interface SequencedCollection<E> extends Collection<E> {
// 新規追加メソッド
SequencedCollection<E> reversed();
// Dequeから昇格したメソッド
void addFirst(E);
void addLast(E);
E getFirst();
E getLast();
E removeFirst();
E removeLast();
}
set.reversed().stream()
とできる
© 2022 NTT DATA Corporation 18
SequencedSetインタフェース
interface SequencedSet<E> extends Set<E>, SequencedCollection<E> {
SequencedSet<E> reversed();
}
// 比較のためSequencedCollectionインタフェースを再掲
interface SequencedCollection<E> extends Collection<E> {
SequencedCollection<E> reversed();
}
共変戻り値でオーバーライド
している
© 2022 NTT DATA Corporation 19
SequencedMapインタフェース
interface SequencedMap<K,V> extends Map<K,V> {
// 新規追加メソッド
SequencedMap<K,V> reversed();
SequencedSet<K> sequencedKeySet();
SequencedCollection<V> sequencedValues();
SequencedSet<Entry<K,V>> sequencedEntrySet();
V putFirst(K, V);
V putLast(K, V);
// SortedMapとNavigableMapから昇格したメソッド
Entry<K, V> firstEntry();
Entry<K, V> lastEntry();
K firstKey();
K lastKey();
Entry<K, V> pollFirstEntry();
Entry<K, V> pollLastEntry();
}
© 2022 NTT DATA Corporation 20
Collectionsクラスへの追加メソッド
 static <T> SequencedCollection<T>
unmodifiableSequencedCollection(SequencedCollection<? extends T> c)
 static <T> SequencedSet<T>
unmodifiableSequencedSet(SequencedSet<? extends T> s)
 static <K,V> SequencedMap<K,V>
unmodifiableSequencedMap(SequencedMap<? extends K, ? extends V> m)
 戻り値の実際の型はUnmodifiableSequenced[Collection|Set|Map]となる
© 2022 NTT DATA Corporation 21
ビルドすれば実際に試せます
© 2022 NTT DATA Corporation 22
SequencedCollection#reversed()
 戻り値は降順に並び替えた新しいコレクションではない
 ReverseOrder...Viewクラスのインスタンスを返す
• ReverseOrderListView、ReverseOrderSortedSetViewなど
• 元のコレクションを内部に保持し 各操作を降順で扱う
© 2022 NTT DATA Corporation 23
SequencedCollection#reversed()
 戻り値は降順に並び替えた新しいコレクションではない
 ReverseOrder...Viewクラスのインスタンスを返す
• ReverseOrderListView、ReverseOrderSortedSetViewなど
• 元のコレクションを内部に保持し 各操作を降順で扱う
// 一部抜粋
class ReverseOrderListView<E> implements List<E> {
final List<E> base;
public E get(int i) {
return base.get(base.size() - i - 1);
}
...
}
© 2022 NTT DATA Corporation 24
SequencedCollection#reversed()
 ReverseOrder...Viewクラスのインスタンスを返す
• 元のコレクションを内部に保持し 各操作を降順で扱う
• よって 元のコレクション 降順のコレクション どちらかを変更しても
両方とも変更したコレクションとなる
// 一部抜粋
class ReverseOrderListView<E> implements List<E> {
final List<E> base;
public E get(int i) {
return base.get(base.size() - i - 1);
}
...
}
© 2022 NTT DATA Corporation 25
セッションの感想
 現状はたしかに不便 一貫性がないと気づいた
• Javaに慣れきってこうした側面が見えていない自分が見えた
© 2022 NTT DATA Corporation 26
The Sincerest Form of Flattery
[LRN1426]
© 2022 NTT DATA Corporation 27
スピーカー
 Maurice Naftalinさん
 Javaチャンピオン
 『Java Generics and Collections』(2006)の共著者
 パターンマッチの部分のみJose Paumardさん
© 2022 NTT DATA Corporation 28
セッションタイトルの謎
The Sincerest Form of Flattery
(日本語訳) もっとも誠実なお世辞
© 2022 NTT DATA Corporation 29
セッションの内容
Javaが関数型言語から学び追加した機能について
Scalaと比較しながら確認する
© 2022 NTT DATA Corporation 30
タイトルと内容がどう関連するのかわからなかった
タイトル: The Sincerest Form of Flattery
(日本語訳) もっとも誠実なお世辞
内容: Javaが関数型言語から学び追加した機能について
Scalaと比較しながら確認する
© 2022 NTT DATA Corporation 31
有名な文章の一部
“Imitation is the sincerest form of flattery that
mediocrity can pay to greatness.”
(日本語訳) 模倣は凡人が偉大さに対して送ることができる
もっとも誠実なお世辞である
― オスカー・ワイルド
© 2022 NTT DATA Corporation 32
セッションタイトルの謎解き
意地悪な視点でタイトルと内容を照合すると
凡庸な言語であるJavaによる
先を行っている言語としての関数型(Scala) の機能の
模倣についてのセッション
© 2022 NTT DATA Corporation 33
関数型言語のエレガントで数学的にも正しい機能
 高階関数
• Lisp 1958年
 パラメータ多相
• ML 1975年
 パターンマッチ
• Caml 1985年
ただし実用的と言えないところもあった
© 2022 NTT DATA Corporation 34
Pizza言語
Javaにこの3つの機能を加えたプログラミング言語
 高階関数
 パラメータ多相
 パターンマッチ
https://pizzacompiler.sourceforge.net/
© 2022 NTT DATA Corporation 35
Pizzaコードでのパラメータ多相
class StoreSomething<A> {
A something;
StoreSomething(A something) {
this.something = something;
}
A get() {
return something;
}
}
interface Set<A implements Comparable> {
boolean contains(A x);
Set<A> include(A x);
}
© 2022 NTT DATA Corporation 36
1997年ごろ
https://dl.acm.org/doi/10.1145/263699.263715
© 2022 NTT DATA Corporation 37
https://www.oreilly.com/library/view/java-generics-and/0596527756/
© 2022 NTT DATA Corporation 38
PizzaからJavaのジェネリクスへ
Pizza
(1997)
GJ: Generic
Java
(1998)
Java 5
(2004)
Scala
(2003)
https://homepages.inf.ed.ac.uk/wadler/gj/Documents/gj-tutorial.pdf
© 2022 NTT DATA Corporation 39
GJからJava 5のジェネリクスへ
 GJの時点でジェネリクスのほぼすべての機能があった
• ワイルドカードを除く
 1998年からJava 5の2004年まで
なぜ6年かかったかは不明?とのこと
• ワイルドカードの実装追加していたにせよ長い?
http://www.bracha.org/wildcards.pdf
© 2022 NTT DATA Corporation 40
ScalaとJavaでの取り組み方の違い
 高階関数
 パラメータ多相
 パターンマッチ
• Scalaはこれらの機能を一気に入れた (後方互換不要なのもある)
• Javaは1つずつ入れている (後方互換性を保ちつつ)
- 2004年にジェネリクス
- 2014年にラムダ式
- パターンマッチは追加中
© 2022 NTT DATA Corporation 41
セッション後半はそれぞれの詳細
 ジェネリクス
• erasure イレージャ
• variance(変性): 共変や反変
• Scalaの場合
 ラムダ式
• Javaで型システムを変更せずに関数を取り込むには
• Scalaの場合
 パターンマッチ
• パターンとは
• Scalaの場合
© 2022 NTT DATA Corporation 42
本セッションでは時間のため1つだけ紹介
 ジェネリクス
• erasure イレージャ
• variance(変性): 共変や反変
• Scalaの場合
 ラムダ式
• Javaで型システムを変更せずに関数を取り込むには
• Scalaの場合
 パターンマッチ
• パターンとは
• Scalaの場合
ビギナーの方向けの
内容です
© 2022 NTT DATA Corporation 43
Javaの配列は共変
// Arrays.sort(Object[] a)を考える
Integer[] a = { 1, 2, 3 };
Arrays.sort(a);
String[] b = { "Alice", "Bob", "Carol" };
Arrays.sort(b);
// Integer配列型もString配列型もObject配列型のサブタイプ
© 2022 NTT DATA Corporation 44
配列を共変にした結果
© 2022 NTT DATA Corporation 45
ジェネリクスの設計方針
 List<Integer>はList<Number>のサブタイプではない
© 2022 NTT DATA Corporation 46
ジェネリクスの設計方針
 境界型パラメータで共変サブタイピングを実現
© 2022 NTT DATA Corporation 47
ジェネリクスの設計方針
 ワイルドカードで反変サプタイピングを実現
• List<? super Number>はList<Number>のスーパータイプ
混乱した方は
Effective Java 第3版
項目31を読んでみましょう
© 2022 NTT DATA Corporation 48
Scalaの場合
 変位指定アノテーションがある
• [+A] [-A] [A]
 たとえばScalaのリストはList[+A]で共変である
abstract class Animal {
def name: String
}
case class Cat(name: String) extends Animal
case class Dog(name: String) extends Animal
val cats: List[Cat] = List(Cat("Alice"), Cat("Bob"))
val animals: List[Animal] = cats // OK
© 2022 NTT DATA Corporation 49
セッションの感想
 各機能の意味や使用方法は知っていても
歴史的経緯はあまり知らなかったので興味深かった
 ジェネリクスについて機能面には習熟していても
そのバックボーンについては知らないことが多いと気づいた
© 2022 NTT DATA Corporation
本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。

More Related Content

PPTX
Apache Sparkの基本と最新バージョン3.2のアップデート(Open Source Conference 2021 Online/Fukuoka ...
NTT DATA Technology & Innovation
 
PPTX
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)
NTT DATA Technology & Innovation
 
PDF
コンテナの作り方「Dockerは裏方で何をしているのか?」
Masahito Zembutsu
 
PDF
PostgreSQLの関数属性を知ろう
kasaharatt
 
PDF
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
NTT DATA Technology & Innovation
 
PDF
オブジェクト指向プログラミングの現在・過去・未来
増田 亨
 
PDF
JavaでCPUを使い倒す! ~Java 9 以降の CPU 最適化を覗いてみる~(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019...
NTT DATA Technology & Innovation
 
PDF
SAT/SMTソルバの仕組み
Masahiro Sakai
 
Apache Sparkの基本と最新バージョン3.2のアップデート(Open Source Conference 2021 Online/Fukuoka ...
NTT DATA Technology & Innovation
 
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)
NTT DATA Technology & Innovation
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
Masahito Zembutsu
 
PostgreSQLの関数属性を知ろう
kasaharatt
 
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
NTT DATA Technology & Innovation
 
オブジェクト指向プログラミングの現在・過去・未来
増田 亨
 
JavaでCPUを使い倒す! ~Java 9 以降の CPU 最適化を覗いてみる~(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019...
NTT DATA Technology & Innovation
 
SAT/SMTソルバの仕組み
Masahiro Sakai
 

What's hot (20)

PPTX
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
NTT DATA Technology & Innovation
 
PPTX
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
NTT DATA Technology & Innovation
 
PDF
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQL16でのロールに関する変更点(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PPTX
NUCで始めるVMware Tanzu
Hirotaka Sato
 
PDF
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
NTT DATA Technology & Innovation
 
PDF
DockerとPodmanの比較
Akihiro Suda
 
PPTX
PostgreSQL 14 モニタリング新機能紹介(PostgreSQL カンファレンス #24、2021/06/08)
NTT DATA Technology & Innovation
 
PDF
KiCadで雑に基板を作る チュートリアル
裕士 常田
 
ODP
Guide To AGPL
Mikiya Okuno
 
PDF
Python 3.9からの新定番zoneinfoを使いこなそう
Ryuji Tsutsui
 
PDF
TIME_WAITに関する話
Takanori Sejima
 
PPTX
フロー技術によるネットワーク管理
Motonori Shindo
 
PDF
Dockerfileを改善するためのBest Practice 2019年版
Masahito Zembutsu
 
PDF
エンジニアから飛んでくるマサカリを受け止める心得
Reimi Kuramochi Chiba
 
PPTX
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PPTX
その Pod 突然落ちても大丈夫ですか!?(OCHaCafe5 #5 実験!カオスエンジニアリング 発表資料)
NTT DATA Technology & Innovation
 
PPTX
OSS-DB Gold 合格体験記(第29回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
最近のOpenStackを振り返ってみよう
Takashi Kajinami
 
PDF
なぜ貴方のモダナイゼーションは評価されないのか ~傾向と対策~ (CloudNative Days Tokyo 2022 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
NTT DATA Technology & Innovation
 
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
NTT DATA Technology & Innovation
 
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQL16でのロールに関する変更点(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
NUCで始めるVMware Tanzu
Hirotaka Sato
 
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
NTT DATA Technology & Innovation
 
DockerとPodmanの比較
Akihiro Suda
 
PostgreSQL 14 モニタリング新機能紹介(PostgreSQL カンファレンス #24、2021/06/08)
NTT DATA Technology & Innovation
 
KiCadで雑に基板を作る チュートリアル
裕士 常田
 
Guide To AGPL
Mikiya Okuno
 
Python 3.9からの新定番zoneinfoを使いこなそう
Ryuji Tsutsui
 
TIME_WAITに関する話
Takanori Sejima
 
フロー技術によるネットワーク管理
Motonori Shindo
 
Dockerfileを改善するためのBest Practice 2019年版
Masahito Zembutsu
 
エンジニアから飛んでくるマサカリを受け止める心得
Reimi Kuramochi Chiba
 
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
その Pod 突然落ちても大丈夫ですか!?(OCHaCafe5 #5 実験!カオスエンジニアリング 発表資料)
NTT DATA Technology & Innovation
 
OSS-DB Gold 合格体験記(第29回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
最近のOpenStackを振り返ってみよう
Takashi Kajinami
 
なぜ貴方のモダナイゼーションは評価されないのか ~傾向と対策~ (CloudNative Days Tokyo 2022 発表資料)
NTT DATA Technology & Innovation
 
Ad

Similar to コレクションフレームワーク関連セッション(JavaOne & Devoxx報告会 2022 発表資料) (20)

PPTX
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
NTT DATA Technology & Innovation
 
PDF
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
NTT DATA Technology & Innovation
 
PPTX
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
NTT DATA Technology & Innovation
 
PPTX
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
NTT DATA Technology & Innovation
 
PDF
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
 
PDF
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
NTT DATA Technology & Innovation
 
PPTX
フックを使ったPostgreSQLの拡張機能を作ってみよう!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PPTX
Let's Start Contributing to OpenJDK from Today!(Oracle Groundbreakers APAC Vi...
NTT DATA Technology & Innovation
 
PDF
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
Naoya Kishimoto
 
PDF
Scala + Finagleの魅力
Kota Mizushima
 
PPTX
LL2021 Java update
torutk
 
PPTX
Oracle Container Engine for Kubernetes (OKE) ご紹介 [2021年5月版]
オラクルエンジニア通信
 
PPTX
WebRTC on Native App
WebRTCConferenceJapan
 
PDF
Daisukei vsug ef
vsug_jim
 
PDF
企業システムで使えるマイクロサービスの特長と実践 (Oracle Cloudウェビナーシリーズ: 2021年4月15日)
オラクルエンジニア通信
 
PPTX
Introduction to Magnum (JP)
Motohiro OTSUKA
 
PDF
第一回社内 Scala 勉強会(一部抜粋)その 2
lyrical_logical
 
PPTX
Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)
NTT DATA Technology & Innovation
 
PDF
ケーススタディ/実装 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第46回】
Tomoharu ASAMI
 
PPTX
第14回しゃちほこオラクル俱楽部
オラクルエンジニア通信
 
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
NTT DATA Technology & Innovation
 
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
NTT DATA Technology & Innovation
 
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
NTT DATA Technology & Innovation
 
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
NTT DATA Technology & Innovation
 
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
 
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
NTT DATA Technology & Innovation
 
フックを使ったPostgreSQLの拡張機能を作ってみよう!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
Let's Start Contributing to OpenJDK from Today!(Oracle Groundbreakers APAC Vi...
NTT DATA Technology & Innovation
 
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
Naoya Kishimoto
 
Scala + Finagleの魅力
Kota Mizushima
 
LL2021 Java update
torutk
 
Oracle Container Engine for Kubernetes (OKE) ご紹介 [2021年5月版]
オラクルエンジニア通信
 
WebRTC on Native App
WebRTCConferenceJapan
 
Daisukei vsug ef
vsug_jim
 
企業システムで使えるマイクロサービスの特長と実践 (Oracle Cloudウェビナーシリーズ: 2021年4月15日)
オラクルエンジニア通信
 
Introduction to Magnum (JP)
Motohiro OTSUKA
 
第一回社内 Scala 勉強会(一部抜粋)その 2
lyrical_logical
 
Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)
NTT DATA Technology & Innovation
 
ケーススタディ/実装 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第46回】
Tomoharu ASAMI
 
第14回しゃちほこオラクル俱楽部
オラクルエンジニア通信
 
Ad

More from NTT DATA Technology & Innovation (20)

PDF
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
NTT DATA Technology & Innovation
 
PDF
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
NTT DATA Technology & Innovation
 
PDF
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
NTT DATA Technology & Innovation
 
PDF
つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)
NTT DATA Technology & Innovation
 
PDF
2025年現在のNewSQL (最強DB講義 #36 発表資料)
NTT DATA Technology & Innovation
 
PDF
Java in Japan: A Journey of Community, Culture, and Global Integration (JavaO...
NTT DATA Technology & Innovation
 
PDF
Unveiling the Hidden Layers of Java Class Files: Beyond Bytecode (Devnexus 2025)
NTT DATA Technology & Innovation
 
PDF
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
NTT DATA Technology & Innovation
 
PDF
Apache Sparkに対するKubernetesのNUMAノードを意識したリソース割り当ての性能効果 (Open Source Conference ...
NTT DATA Technology & Innovation
 
PDF
PostgreSQL最新動向 ~カラムナストアから生成AI連携まで~ (Open Source Conference 2025 Tokyo/Spring ...
NTT DATA Technology & Innovation
 
PDF
pgbenchのスレッドとクライアント (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQLのgitレポジトリから見える2024年の開発状況 (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
NTT DATA Technology & Innovation
 
PDF
生成AI時代のPostgreSQLハイブリッド検索 (第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
DAIS2024参加報告 ~Spark中心にしらべてみた~ (JEDAI DAIS Recap 講演資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQLのHTAP適応について考える (PostgreSQL Conference Japan 2024 講演資料)
NTT DATA Technology & Innovation
 
PDF
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
NTT DATA Technology & Innovation
 
PDF
Gartnerも注目するグリーンソフトウェアの実現に向けて (Green Software Foundation Global Summit 2024 T...
NTT DATA Technology & Innovation
 
PDF
パーティションのATTACH時の注意ポイント (第49回PostgreSQLアンカンファレンス@東京 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
NTT DATA Technology & Innovation
 
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
NTT DATA Technology & Innovation
 
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
NTT DATA Technology & Innovation
 
つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)
NTT DATA Technology & Innovation
 
2025年現在のNewSQL (最強DB講義 #36 発表資料)
NTT DATA Technology & Innovation
 
Java in Japan: A Journey of Community, Culture, and Global Integration (JavaO...
NTT DATA Technology & Innovation
 
Unveiling the Hidden Layers of Java Class Files: Beyond Bytecode (Devnexus 2025)
NTT DATA Technology & Innovation
 
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
NTT DATA Technology & Innovation
 
Apache Sparkに対するKubernetesのNUMAノードを意識したリソース割り当ての性能効果 (Open Source Conference ...
NTT DATA Technology & Innovation
 
PostgreSQL最新動向 ~カラムナストアから生成AI連携まで~ (Open Source Conference 2025 Tokyo/Spring ...
NTT DATA Technology & Innovation
 
pgbenchのスレッドとクライアント (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQLのgitレポジトリから見える2024年の開発状況 (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
NTT DATA Technology & Innovation
 
生成AI時代のPostgreSQLハイブリッド検索 (第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
DAIS2024参加報告 ~Spark中心にしらべてみた~ (JEDAI DAIS Recap 講演資料)
NTT DATA Technology & Innovation
 
PostgreSQLのHTAP適応について考える (PostgreSQL Conference Japan 2024 講演資料)
NTT DATA Technology & Innovation
 
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
NTT DATA Technology & Innovation
 
Gartnerも注目するグリーンソフトウェアの実現に向けて (Green Software Foundation Global Summit 2024 T...
NTT DATA Technology & Innovation
 
パーティションのATTACH時の注意ポイント (第49回PostgreSQLアンカンファレンス@東京 発表資料)
NTT DATA Technology & Innovation
 

Recently uploaded (10)

PDF
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 
PDF
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 
PDF
20250729_Devin-for-Enterprise
Masaki Yamakawa
 
PPTX
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 
PDF
VMUG Japan book vsan 20250515 CPU/Memory vSAN
Kazuhiro Sota
 
PDF
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 
PDF
20250730_QiitaBash_LT登壇資料_PDC_Kurashina.pdf
pdckurashina
 
PDF
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 
PDF
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 
PPTX
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 
20250729_Devin-for-Enterprise
Masaki Yamakawa
 
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 
VMUG Japan book vsan 20250515 CPU/Memory vSAN
Kazuhiro Sota
 
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 
20250730_QiitaBash_LT登壇資料_PDC_Kurashina.pdf
pdckurashina
 
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 

コレクションフレームワーク関連セッション(JavaOne & Devoxx報告会 2022 発表資料)

  • 1. © 2022 NTT DATA Corporation コレクションフレームワーク関連セッション JavaOne & Devoxx報告会 2022 株式会社NTTデータ 阪田 浩一 2022年11月11日 • 想定視聴者: Javaのコレクションフレームワークのクラスを使ったことがあればどなたもOK!
  • 2. © 2022 NTT DATA Corporation 2 自己紹介 • 株式会社NTTデータ 所属 • JVMがとにかく好き • JavaOne 2015から毎回参加 • Javaチャンピオン • OpenJDK Author • 通算パッチ 10数個 • Oracle ACE Pro (Java分野) Koichi Sakata 阪田 浩一 jyukutyo
  • 3. © 2022 NTT DATA Corporation 3 このセッションで話すこと  コレクションフレームワークが関係する2セッション
  • 4. © 2022 NTT DATA Corporation 4 このセッションで話すこと  コレクションフレームワークが関係する2セッション • Sequenced Collections [LRN1422] • The Sincerest Form of Flattery [LRN1426]
  • 5. © 2022 NTT DATA Corporation 5 Sequenced Collections [LRN1422]
  • 6. © 2022 NTT DATA Corporation 6 JEP 431: Sequenced Collections  https://openjdk.org/jeps/431  順序ありのコレクションを定義するインタフェースを追加する
  • 7. © 2022 NTT DATA Corporation 7 JEP 431: Sequenced Collections  https://openjdk.org/jeps/431  順序ありのコレクションを定義するインタフェースを追加する  APIを2つ追加する • コレクションの最初、最後の要素を取得する統一的なAPI • 順序を逆にする統一的なAPI
  • 8. © 2022 NTT DATA Corporation 8 JEP 431: Sequenced Collections  https://openjdk.org/jeps/431  順序ありのコレクションを定義するインタフェースを追加する  APIを2つ追加する • コレクションの最初、最後の要素を取得する統一的なAPI • 順序を逆にする統一的なAPI  このJEPはCandidateステータスのため ドラフト実装をもとにディスカッション中 • https://github.com/openjdk/jdk/pull/7387
  • 9. © 2022 NTT DATA Corporation 9 スピーカー  Stuart Marksさん  Oracle社の方  このJEP 431のオーナー  IDEでのコードを使った説明のみのためスライドはなし • 記憶に加え JEPの記述とドラフトPRのコードを元にレポートします
  • 10. © 2022 NTT DATA Corporation 10 コレクションフレームワークの課題  順序ありコレクションとしてListとDequeがあるが 共通のインタフェースはCollectionで順序なしになる  順序ありのコレクションを表すのに この2つは具体的過ぎる
  • 11. © 2022 NTT DATA Corporation 11 コレクションフレームワークの課題  順序ありコレクションとしてListとDequeがあるが 共通のインタフェースはCollectionで順序なしになる  順序ありのコレクションを表すのに この2つは具体的過ぎる  Setを例に挙げると SetとHashSetは順序なし LinkedHashSetとSortedSetは順序あり 使いづらい わかりづらい 加えてunmodifiableSet()すると順序は失われる
  • 12. © 2022 NTT DATA Corporation 12 コレクションフレームワークの課題  順序ありコレクションとしてListとDequeがあるが 共通のインタフェースはCollectionで順序なしになる  順序ありのコレクションを表すのに この2つは具体的過ぎる  Setを例に挙げると SetとHashSetは順序なし LinkedHashSetとSortedSetは順序あり 使いづらい わかりづらい 加えてunmodifiableSet()すると順序は失われる  最初と最後の要素を取得する操作に統一性がない  降順(逆順)で反復する操作に統一性がない
  • 13. © 2022 NTT DATA Corporation 13 最初と最後の要素を取得する操作に統一性がない 型 最初の要素取得 最後の要素取得 List list.get(0) list.get(list.size()- 1) Deque deque.getFirst() deque.getLast() SortedSet sortedSet.first() sortedSet.last() LinkedHashSet linkedHashSet.iterator() .next() なし
  • 14. © 2022 NTT DATA Corporation 14 降順で反復する操作に統一性がない // NavigableSetだとdescendingSet()で降順のビューを取得できる for (var e : navSet.descendingSet()) process(e); // Dequeは降順イテレータが使える for (var it = deque.descendingIterator(); it.hasNext();) { var e = it.next(); process(e); } // ListだとListIteratorを使う for (var it = list.listIterator(list.size()); it.hasPrevious();) { var e = it.previous(); process(e); } // LinkedHashSetだと他のコレクションクラスにコピーするしかない
  • 15. © 2022 NTT DATA Corporation 15 降順で反復する操作に統一性がない // NavigableSetだとdescendingSet()で降順のビューを取得できる for (var e : navSet.descendingSet()) process(e); // Dequeは降順イテレータが使える for (var it = deque.descendingIterator(); it.hasNext();) { var e = it.next(); process(e); } // ListだとListIteratorを使う for (var it = list.listIterator(list.size()); it.hasPrevious();) { var e = it.previous(); process(e); } // LinkedHashSetだと他のコレクションクラスにコピーするしかない 加えてSetが返ってくるから stream()を呼んで Stream APIを使うことも IteratorからStream取得は Spliteratorsに渡して… と手間がかかる
  • 16. © 2022 NTT DATA Corporation 16 新しいインタフェースの導入 https://openjdk.org/jeps/431
  • 17. © 2022 NTT DATA Corporation 17 SequencedCollectionインタフェース interface SequencedCollection<E> extends Collection<E> { // 新規追加メソッド SequencedCollection<E> reversed(); // Dequeから昇格したメソッド void addFirst(E); void addLast(E); E getFirst(); E getLast(); E removeFirst(); E removeLast(); } set.reversed().stream() とできる
  • 18. © 2022 NTT DATA Corporation 18 SequencedSetインタフェース interface SequencedSet<E> extends Set<E>, SequencedCollection<E> { SequencedSet<E> reversed(); } // 比較のためSequencedCollectionインタフェースを再掲 interface SequencedCollection<E> extends Collection<E> { SequencedCollection<E> reversed(); } 共変戻り値でオーバーライド している
  • 19. © 2022 NTT DATA Corporation 19 SequencedMapインタフェース interface SequencedMap<K,V> extends Map<K,V> { // 新規追加メソッド SequencedMap<K,V> reversed(); SequencedSet<K> sequencedKeySet(); SequencedCollection<V> sequencedValues(); SequencedSet<Entry<K,V>> sequencedEntrySet(); V putFirst(K, V); V putLast(K, V); // SortedMapとNavigableMapから昇格したメソッド Entry<K, V> firstEntry(); Entry<K, V> lastEntry(); K firstKey(); K lastKey(); Entry<K, V> pollFirstEntry(); Entry<K, V> pollLastEntry(); }
  • 20. © 2022 NTT DATA Corporation 20 Collectionsクラスへの追加メソッド  static <T> SequencedCollection<T> unmodifiableSequencedCollection(SequencedCollection<? extends T> c)  static <T> SequencedSet<T> unmodifiableSequencedSet(SequencedSet<? extends T> s)  static <K,V> SequencedMap<K,V> unmodifiableSequencedMap(SequencedMap<? extends K, ? extends V> m)  戻り値の実際の型はUnmodifiableSequenced[Collection|Set|Map]となる
  • 21. © 2022 NTT DATA Corporation 21 ビルドすれば実際に試せます
  • 22. © 2022 NTT DATA Corporation 22 SequencedCollection#reversed()  戻り値は降順に並び替えた新しいコレクションではない  ReverseOrder...Viewクラスのインスタンスを返す • ReverseOrderListView、ReverseOrderSortedSetViewなど • 元のコレクションを内部に保持し 各操作を降順で扱う
  • 23. © 2022 NTT DATA Corporation 23 SequencedCollection#reversed()  戻り値は降順に並び替えた新しいコレクションではない  ReverseOrder...Viewクラスのインスタンスを返す • ReverseOrderListView、ReverseOrderSortedSetViewなど • 元のコレクションを内部に保持し 各操作を降順で扱う // 一部抜粋 class ReverseOrderListView<E> implements List<E> { final List<E> base; public E get(int i) { return base.get(base.size() - i - 1); } ... }
  • 24. © 2022 NTT DATA Corporation 24 SequencedCollection#reversed()  ReverseOrder...Viewクラスのインスタンスを返す • 元のコレクションを内部に保持し 各操作を降順で扱う • よって 元のコレクション 降順のコレクション どちらかを変更しても 両方とも変更したコレクションとなる // 一部抜粋 class ReverseOrderListView<E> implements List<E> { final List<E> base; public E get(int i) { return base.get(base.size() - i - 1); } ... }
  • 25. © 2022 NTT DATA Corporation 25 セッションの感想  現状はたしかに不便 一貫性がないと気づいた • Javaに慣れきってこうした側面が見えていない自分が見えた
  • 26. © 2022 NTT DATA Corporation 26 The Sincerest Form of Flattery [LRN1426]
  • 27. © 2022 NTT DATA Corporation 27 スピーカー  Maurice Naftalinさん  Javaチャンピオン  『Java Generics and Collections』(2006)の共著者  パターンマッチの部分のみJose Paumardさん
  • 28. © 2022 NTT DATA Corporation 28 セッションタイトルの謎 The Sincerest Form of Flattery (日本語訳) もっとも誠実なお世辞
  • 29. © 2022 NTT DATA Corporation 29 セッションの内容 Javaが関数型言語から学び追加した機能について Scalaと比較しながら確認する
  • 30. © 2022 NTT DATA Corporation 30 タイトルと内容がどう関連するのかわからなかった タイトル: The Sincerest Form of Flattery (日本語訳) もっとも誠実なお世辞 内容: Javaが関数型言語から学び追加した機能について Scalaと比較しながら確認する
  • 31. © 2022 NTT DATA Corporation 31 有名な文章の一部 “Imitation is the sincerest form of flattery that mediocrity can pay to greatness.” (日本語訳) 模倣は凡人が偉大さに対して送ることができる もっとも誠実なお世辞である ― オスカー・ワイルド
  • 32. © 2022 NTT DATA Corporation 32 セッションタイトルの謎解き 意地悪な視点でタイトルと内容を照合すると 凡庸な言語であるJavaによる 先を行っている言語としての関数型(Scala) の機能の 模倣についてのセッション
  • 33. © 2022 NTT DATA Corporation 33 関数型言語のエレガントで数学的にも正しい機能  高階関数 • Lisp 1958年  パラメータ多相 • ML 1975年  パターンマッチ • Caml 1985年 ただし実用的と言えないところもあった
  • 34. © 2022 NTT DATA Corporation 34 Pizza言語 Javaにこの3つの機能を加えたプログラミング言語  高階関数  パラメータ多相  パターンマッチ https://pizzacompiler.sourceforge.net/
  • 35. © 2022 NTT DATA Corporation 35 Pizzaコードでのパラメータ多相 class StoreSomething<A> { A something; StoreSomething(A something) { this.something = something; } A get() { return something; } } interface Set<A implements Comparable> { boolean contains(A x); Set<A> include(A x); }
  • 36. © 2022 NTT DATA Corporation 36 1997年ごろ https://dl.acm.org/doi/10.1145/263699.263715
  • 37. © 2022 NTT DATA Corporation 37 https://www.oreilly.com/library/view/java-generics-and/0596527756/
  • 38. © 2022 NTT DATA Corporation 38 PizzaからJavaのジェネリクスへ Pizza (1997) GJ: Generic Java (1998) Java 5 (2004) Scala (2003) https://homepages.inf.ed.ac.uk/wadler/gj/Documents/gj-tutorial.pdf
  • 39. © 2022 NTT DATA Corporation 39 GJからJava 5のジェネリクスへ  GJの時点でジェネリクスのほぼすべての機能があった • ワイルドカードを除く  1998年からJava 5の2004年まで なぜ6年かかったかは不明?とのこと • ワイルドカードの実装追加していたにせよ長い? http://www.bracha.org/wildcards.pdf
  • 40. © 2022 NTT DATA Corporation 40 ScalaとJavaでの取り組み方の違い  高階関数  パラメータ多相  パターンマッチ • Scalaはこれらの機能を一気に入れた (後方互換不要なのもある) • Javaは1つずつ入れている (後方互換性を保ちつつ) - 2004年にジェネリクス - 2014年にラムダ式 - パターンマッチは追加中
  • 41. © 2022 NTT DATA Corporation 41 セッション後半はそれぞれの詳細  ジェネリクス • erasure イレージャ • variance(変性): 共変や反変 • Scalaの場合  ラムダ式 • Javaで型システムを変更せずに関数を取り込むには • Scalaの場合  パターンマッチ • パターンとは • Scalaの場合
  • 42. © 2022 NTT DATA Corporation 42 本セッションでは時間のため1つだけ紹介  ジェネリクス • erasure イレージャ • variance(変性): 共変や反変 • Scalaの場合  ラムダ式 • Javaで型システムを変更せずに関数を取り込むには • Scalaの場合  パターンマッチ • パターンとは • Scalaの場合 ビギナーの方向けの 内容です
  • 43. © 2022 NTT DATA Corporation 43 Javaの配列は共変 // Arrays.sort(Object[] a)を考える Integer[] a = { 1, 2, 3 }; Arrays.sort(a); String[] b = { "Alice", "Bob", "Carol" }; Arrays.sort(b); // Integer配列型もString配列型もObject配列型のサブタイプ
  • 44. © 2022 NTT DATA Corporation 44 配列を共変にした結果
  • 45. © 2022 NTT DATA Corporation 45 ジェネリクスの設計方針  List<Integer>はList<Number>のサブタイプではない
  • 46. © 2022 NTT DATA Corporation 46 ジェネリクスの設計方針  境界型パラメータで共変サブタイピングを実現
  • 47. © 2022 NTT DATA Corporation 47 ジェネリクスの設計方針  ワイルドカードで反変サプタイピングを実現 • List<? super Number>はList<Number>のスーパータイプ 混乱した方は Effective Java 第3版 項目31を読んでみましょう
  • 48. © 2022 NTT DATA Corporation 48 Scalaの場合  変位指定アノテーションがある • [+A] [-A] [A]  たとえばScalaのリストはList[+A]で共変である abstract class Animal { def name: String } case class Cat(name: String) extends Animal case class Dog(name: String) extends Animal val cats: List[Cat] = List(Cat("Alice"), Cat("Bob")) val animals: List[Animal] = cats // OK
  • 49. © 2022 NTT DATA Corporation 49 セッションの感想  各機能の意味や使用方法は知っていても 歴史的経緯はあまり知らなかったので興味深かった  ジェネリクスについて機能面には習熟していても そのバックボーンについては知らないことが多いと気づいた
  • 50. © 2022 NTT DATA Corporation 本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。