583 Views
November 23, 24
スライド概要
https://hokkaido-programmers-sapporo.connpass.com/event/336598/ での発表資料です。(問題のある画像の処理をしています。)
共変?反変? 僕、非変!! 北海道プログラマーズ札幌 集まり #1 nmemoto 狩野英孝さんの画像
この発表には、 発表者特有の感性が 含まれております。 生温かい目でご笑覧ください。
自己紹介 nmemoto 好きな藤井風の曲: 花、まつり、燃えよ 祝!紅白出場!
ある日のこと、Effective Java 項目31と2日向き合った僕 項目31 APIの柔軟性向上のために境界ワイルドカードを使う Iterable<? extends E> public static <E> Set<E> union(Set<? extends E> s1, Set<? extends E> s2) スギちゃんさんの画像 Collection<? super E> public static <T extends Comparable<? super T>> T max(List<? extends T> list)
ある日のこと、Effective Java 項目31と2日向き合った僕 項目31 APIの柔軟性向上のために 境界ワイルドカード を使う Iterable<? extends E> public static <E> Set<E> union(Set<? extends E> s1, Set<? extends E> s2) スギちゃんさんの画像 Collection<? super E> public static <T extends Comparable<? super T>> T max(List<? extends T> list) https://www.jprime.jp/articles/-/25819?page=3
public static <E> Set<E> union(Set<? extends E> s1, Set<? extends E> s2) Iterable<? ジェネリクスの型パラメータ部分を extends E> extendsしたり、 superしたりしてる Collection<? super E> public static <T extends Comparable<? super T>> T max(List<? extends T> list)
それはそうなんだけど、2 日前の自分に伝えたい 違う、そうじゃない 鈴木雅之さんの 違う、そうじゃない のジャケット写真
Effective Java 項目31と向き合い始めて3日後の僕 項目31 APIの柔軟性向上のために境界ワイルドカードを使う → APIの柔軟性向上のためにJavaでは境界ワイルドカードを使う → APIの柔軟性向上のために共変・反変 を活用しよう 、Javaでは境界ワイルドカードを 使う 不変(非変)の話はあるのに、共変・反変という言葉がな ぜか出てこなかった
共変・反変とは A <: B(AがBのサブタイプ)のときの、T<A>とT<B>の関係性が ● ● ● T<A> <: T<B> となる: 共変 T<B> <: T<A> となる: 反変 共変でも反変でもない: 非変
共変・反変が使えないと何が困るか
void printNumbers(List<Number> numbers) {
for (Number number : numbers) {
System.out.println(number);
}
}
// これが呼び出せない
List<Integer> integers = List.of(1, 2, 3);
printNumbers(integers); // コンパイルエラー!
Integer <: Numberだけど、
List<Integer>とList<Number>
は非変なので、呼び出せない
共変・反変が使えないと何が困るか
void printNumbers(List<? extends Number> numbers) {
for (Number number : numbers) {
System.out.println(number);
}
NumberとNumberのサブタイ
}
プのList全般の呼出可能
→ 共変
// 呼び出し可能
List<Integer> integers = List.of(1, 2, 3);
printNumbers(integers); // OK
共変・反変が使えないと何が困るか void addNumbers(List<Number> numbers) { numbers.add(42); } List<Object>とList<Number> // これが呼び出せない は非変なので、呼び出せない List<Object> objects = new ArrayList<>(); addNumbers(objects); // コンパイルエラー!
共変・反変が使えないと何が困るか void addNumbers(List<? super Integer> numbers) { numbers.add(42); } Integerのスーパータイプの // 呼び出し可能 List全般の呼出可能 →反変 List<Object> objects = new ArrayList<>(); addNumbers(objects); // OK
Javaの話に飽きた君へ とにかく明るい安村さん の画像 安心してください。 TSの話(少し)ありますよ。 https://tower.jp/article/feature_item/2015/05/13/2501
TypeScriptの変性アノテーション ブルーベリー本の p.164に書いてあるよ uhyo(2022)『プロを目指す人のた めのTypeScript入門』読者が最 新情報にキャッチアップできる記 事 より抜粋 (私見ですが) 型安全性重視の現れ https://zenn.dev/uhyo/articles/blueberry-book-catchup#%E5%9E%8B%E5%BC%95%E6%95%B0%E3%81%AB%E 5%AF%BE%E3%81%99%E3%82%8B%E5%A4%89%E6%80%A7%E3%82%A2%E3%83%8E%E3%83%86%E3% 83%BC%E3%82%B7%E3%83%A7%E3%83%B3
(nmemotoの解釈だと)要するに Effective Java 項目31 APIの柔軟性向上のために境界ワイルドカードを使う → APIの柔軟性向上のためにJavaでは境界ワイルドカードを使う → APIの柔軟性向上のために共変・反変を活用しよう 、Javaでは境界ワイルドカードを 使う → JavaではAPIの柔軟性向上のために共変・反変を活用しよう 、そのために 境界ワイ ルドカードを使う 共変・反変の関係を使うことで意図する関係を正 確に表現できる (型安全性というより、 )Javaだと柔軟性(汎用性) のために共変・反変を使っていそう
どんな方(型)でも自身の振る舞いは変わらない
どんな方(型)でも自身の振る舞いは変わらない 僕、非変!! 狩野英孝さんの画像