Item 31. Wildcard Type
νμ μ μμΌλμΉ΄λλ₯Ό μ¬μ©ν΄ API μ μ°μ±μ λμ΄λΌ
item 28μμ μΈκΈνλ― λ§€κ°λ³μν νμ
μ λΆκ³΅λ³(invariant)μΈ λΆλΆμ λν΄ μλ¬Έμ μ κ°μ§ μ μλ€.
List<String>μ List<Object>μ νμ νμ
μ΄ μλλ°, List<String>μ List<Object>κ° νλ μΌμ μ λλ‘ μνν μ μκΈ° λλ¬Έμ 리μ€μ½ν μΉν μμΉμ λ°λ₯΄λ©΄ λΆκ³΅λ³μΈ κ²μ΄ νλΉνλ€.
νμ§λ§ μ΄λλ‘ μ¬μ©νκΈ°μ λΆνΈν μ μ΄ λ§μ λ§€κ°λ³μν νμ μ μ μ°νκ² μ¬μ©ν μ μλλ‘ λμμ£Όλ λ°©λ²μ΄ μλλ°, λ°λ‘ νμ μ μμΌλμΉ΄λ νμ (bounded wildcard type)μ μ¬μ©νλ κ²μ΄λ€.
import java.util.Collection;
class Stack<E> {
// ...
public void push(E e) {
elements[size++] = e;
}
public void pushAll(Iterable<E> src) {
for (E e : src) {
push(e);
}
}
public void pop(E e) {
E result = elements[--size];
elements[size] = null;
return result;
}
public void popAll(Collection<E> dst) {
while (!isEmpty()) {
dst.add(pop());
}
}
}
class Main {
public static void main(String[] args) {
Stack<Number> numberStack = new Stack<>();
Iterable<Integer> integers = ...;
numberStack.pushAll(integers); // μ»΄νμΌ μλ¬, Iterable<Integer>λ Iterable<Number>μ νμ νμ
μ΄ μλ
Collection<Object> objects = ...;
numberStack.popAll(objects); // μ»΄νμΌ μλ¬, Collection<Object>λ Collection<Number>μ νμ νμ
μ΄ μλ
}
}Integerλ Numberμ νμ νμ μ΄λ λ Όλ¦¬μ μΌλ‘ μ λμν κ² κ°μ§λ§, μ λ€λ¦μ λΆκ³΅λ³ νΉμ±μΌλ‘ μΈν΄ μ»΄νμΌ μλ¬κ° λ°μνλ€. ν΄κ²°μ± μΌλ‘λ μμ μμ΄ν λ€μμ μΈκΈνλ―μ΄ νμ μ μμΌλμΉ΄λ νμ μ μ¬μ©νλ κ²μ΄λ€.
Iterable<? extends E>
Eμ νμ νμ μ λͺ¨λ ν¬ν¨νλ Iterable νμ μ λ§€κ°λ³μλ‘ λ°μ μ μκ² λμ΄, Numberμ νμ νμ μΈ Integerλ₯Ό ν¬ν¨νλ Iterable νμ μ λ§€κ°λ³μλ‘ λ°μ μ μκ² λμλ€.
Collection<? super E>
Eμ μμ νμ μ λͺ¨λ ν¬ν¨νλ Collection νμ μ λ§€κ°λ³μλ‘ λ°μ μ μκ² λμ΄, Numberμ μμ νμ μΈ Objectλ₯Ό ν¬ν¨νλ Collection νμ μ λ§€κ°λ³μλ‘ λ°μ μ μκ² λμλ€.
μ΄μ²λΌ νμ μ μμΌλμΉ΄λ νμ μ μ¬μ©νλ©΄ λ§€κ°λ³μν νμ μ΄ λΆκ³΅λ³μ΄λΌλ μ μ°νκ² μ¬μ©ν μ μκ² λλ€.
PECS(Producer-Extends, Consumer-Super)
νμ μ μμΌλμΉ΄λ νμ
μ μ¬μ©νλ©΄ λ§€κ°λ³μν νμ
μ΄ λΆκ³΅λ³μ΄λΌλ μ μ°νκ² μ¬μ©ν μ μκ² λμμ§λ§, μ΄λ₯Ό μ¬μ©ν λ μ£Όμν μ μ΄ μλ€.
λ°λ‘ μμ°μ(producer)μ μλΉμ(consumer) μν μ λ°λΌ extendsμ superλ₯Ό μ μ ν μ¬μ©ν΄μΌ νλ€λ κ²μ΄λ©°, κ·Έ μμΉμ λ€μκ³Ό κ°λ€.
λ§€κ°λ³μν νμ Tκ° μμ°μμΈ κ²½μ°:
<? extends T>λ§€κ°λ³μν νμ Tκ° μλΉμμΈ κ²½μ°:
<? super T>λ§€κ°λ³μν νμ Tκ° μμ°μμ μλΉμμΈ κ²½μ°:
Tλ°ν νμ : νμ μ μμΌλμΉ΄λ νμ μ μ© X, ν΄λΌμ΄μΈνΈ μ½λμ μμΌλμΉ΄λ νμ μ΄ μ νλκΈ° λλ¬Έμ ν΄λΌμ΄μΈνΈ μ½λκ° λ 볡μ‘ν΄μ§
μμ μΈκΈν Stack μμ μμλ μμ°μ(pushAll)μ μλΉμ(popAll) μν μ λ°λΌ extendsμ superλ₯Ό μ¬μ©νλ€.
μ λ μν©μ΄ μλ, μ
λ ₯ λ§€κ°λ³μκ° μμ°μμ μλΉμ μν μ λμμ ν΄μΌ νλ μν©μμ μμΌλμΉ΄λ νμ
μ μ°μ§ μλ κ²μ΄ μ’λ€.
μ 곡μμ item 30μμ μ΄ν΄λ³΄μλ Collections.max λ©μλμλ μ΄λ―Έ μ μ©λμ΄ μμμ μ μ μλ€.
Collection<? extends T> coll: μ λ ₯ λ§€κ°λ³μμμ μμ°μ μν μ νλ―λ‘extendsλ₯Ό μ¬μ©Comparable<? super T>: μ λ ₯ λ§€κ°λ³μλ₯Ό μλΉνλ©΄μcompareToλ©μλλ₯Ό νΈμΆνλ―λ‘superλ₯Ό μ¬μ©
νμ
λ§€κ°λ³μ vs μμΌλμΉ΄λ
νμ λ§€κ°λ³μμ μμΌλμΉ΄λλ νμ λ€νμ±μ μμ΄ κ³΅ν΅λλ λΆλΆμ΄ μμ΄ λ μ€ νλλ₯Ό μ νν΄ μ¬μ©ν μ μλ κ²½μ°κ° μλ€.
μ μ²λΌ λ©μλ μ μΈμ νμ λ§€κ°λ³μκ° ν λ²λ§ λμ€λ κ²½μ°μ μμΌλμΉ΄λλ‘ λ체νλ κ²μ΄ μ’μ λ°©λ²μ΄ λ μ μλ€. public APIλΌλ©΄ λ λ²μ§Έ λ©μλκ° μ΄λ€ νμ μ Listλ λ°μ μ μκΈ° λλ¬Έμ λ μ μ°νκ² μ¬μ©ν μ μκΈ° λλ¬Έμ΄λ€.
μ΄λ₯Ό ꡬννκΈ° μν΄ μΆκ°μ μΈ helper λ©μλλ₯Ό ꡬνν΄μΌ νλ€λ λ¨μ μ΄ μμ§λ§, ν΄λΌμ΄μΈνΈλ μ΄λ₯Ό μ νμκ° μμΌλ―λ‘ λ¬Έμ κ° λμ§ μλλ€.
Last updated
Was this helpful?