IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

Effective Java 読書会 7 日目 「PECS! PECS! PECS!」

はじめに

一番PECSにこだわってる... - ズバリどうぞ - はてなセリフ

今日読んだところ

126 ページ〜 142 ページ

Object を使ったその瞬間が

ジェネリック型を使うチャンスなのです!!!
たとえば、以下みたいな

public class Stack {

    /* snip */

    public Object pop() {
        /* snip */
    }

    public void push(Object e) {
        /* snip */
    }
}

こうなる

public class Stack<E> {

    /* snip */

    public E pop() {
        /* snip */
    }

    public void push(E e) {
        /* snip */
    }
}

Object を使わなくすると

キャストがなくなる
キャスト良くない!例外でるからね!

どうしてもキャストしなきゃだめなパターン

配列をラップするためのジェネリックス型を使う場合は、キャストしなきゃしょうがない

public class Stack<E> {

    private E[] elements;

    Stack() {
        elements = new E[100]; // 出来ません><
    }

    public E pop() {
        /* snip */
    }

    public void push(E e) {
        /* snip */
    }
}

なので、

public class Stack<E> {

    private E[] elements;

    Stack() {
        elements = (E[]) new Object[100]; // とか
    }

    public E pop() {
        /* snip */
    }

    public void push(E e) {
        /* snip */
    }
}
public class Stack<E> {

    private Object[] elements;

    Stack() {
        elements = new Object[100];
    }

    public E pop() {
        element = (E) elements[index]; // みたいな
        /* snip */
    }

    public void push(E e) {
        /* snip */
    }
}

論理的に安全なことを確認して、 @SuppressWarnig("uncheck") しちゃいな YO!

ジェネリックメソッドもアルよねー

アルよねー

コンストラクタの型推論するために static なジェネリックメソッドつかうよねー

よねー

コンストラクタの型推論

Java 7 では HashMap map = new HashMap<>(); みたいになるらしい YO! という話がでた

PECS! PECS!

プロデューサは extends 、コンシューマは super だってばよ!
たとえば、

public Hoge {

    // producer は CharSequence のプロデューサ
    // consumer は CharSequence のコンシューマ
    public static void foo(List<? extends CharSequence> producer, List<? super CharSequence> consumer) {

        // プロデューサからは get できる
        CharSequence hoge = producer.get(0);

        // コンシューマには set できる
        consumer.set(0, hoge);

        // 以下はコンパイルエラー
        producer.set(0, hoge);
        hoge = consumer.get(0);
    }
}

ジェネリックな型を作ったら

境界ワイルドカードを意識せずにその型を使えるか確認する
super extends も問題なく使えるか確認。

トーク

Class を渡すことを型トークンというよ!静的動的に型安全!

まとめ

魔法の弾丸 PECS!