今日読んだところ
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!
ジェネリックメソッドもアルよねー
アルよねー
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); } }
まとめ
魔法の弾丸 PECS!