PECS Generic

Producer Extends & Consumer Super 의 μ•½μžλ‘œ
λ­”κ°€λ₯Ό μƒμ‚°ν•˜λŠ” 일을 ν•˜λ©΄ 상속을 λ°›κ³  λ­”κ°€λ₯Ό μ†ŒλΉ„ν•˜λŠ” 일을 ν•˜λ©΄ 상속을 ν•΄μ£ΌλŠ” 것이닀.

κ°€λ Ή μ œλ„€λ¦­μ˜ λ§€κ°œλ³€μˆ˜ν™” νƒ€μž… (Parameterized Types) λŠ” 무곡변 (invariant) ν•œ νŠΉμ„±μ΄ μžˆλ‹€.

μ„œλ‘œ λ‹€λ₯Έ νƒ€μž… Type1 Type2 κ°€ μžˆλ‹€κ³  κ°€μ • 해봀을 λ•Œ List<Type1> 은 List<Type2> 의 μƒμœ„ νƒ€μž… (Supertype) 도 ν•˜μœ„ νƒ€μž… (Subtype) 도 μ•„λ‹ˆλ‹€.

μƒμ‚°μž 관점

public void doSomething(List<? extends MyClass> list) {
  for (MyClass e : list) { // Ok
    System.out.println(e);
  }
}

public void doSomething(List<? extends MyClass> list) {
  list.add(new MyClass()); // Compile Error
}

μ†ŒλΉ„μž 관점

public void doSomething(List<? super MyClass> list) {
  list.add(new MyClass()); // Ok
}

public void doSomething(List<? super MyClass> list) {
  for (MyClass e : list) { // Compile Error
    System.out.println(e);
  }
}