회사에서 공짜 음료수 자판기를 설치 하기로 했다.
설치할 수 있는 자판기 종류는 무엇이 있을까?
콜라전용 또는 사이다전용 그리고 둘 중 아무거나 나오는 음료수 자판기를 설치 할 수 있겠다.
class 음료 {}
class 콜라 extends 음료 {}
class 사이다 extends 음료 {}
class CovarianceTest {
public static void main(String[] args) {
자판기<콜라> 콜라자판기 = new 자판기<>();
자판기<사이다> 사이다자판기 = new 자판기<>();
자판기<음료> 랜덤음료자판기 = new 자판기<>();
콜라자판기.음료추가(new 콜라());
사이다자판기.음료추가(new 사이다());
랜덤음료자판기.음료추가(new 콜라());
랜덤음료자판기.음료추가(new 사이다());
판매하기(콜라자판기);
판매하기(사이다자판기);
판매하기(랜덤음료자판기);
}
public static 음료 판매하기(자판기<? extends 음료> 기계) {
return 기계.음료반환();
}
}
직원들이 공짜 음료를 너무 많이 마시는 바람에 캔 수거함이 필요 했다.
회사는 수거함을 어떻게 구입해야 할까?
콜라캔 수거함만 구입하면 사이다캔은 처리 할 곳이 없고 사이다캔만이면 콜라캔이 문제다.
따라서 전용수거함을 따로 구입 하거나 각 캔을 동시에 처리 할 수 있는 수거함을 구입 할 수도 있고
물론 콜라전용과 동시용, 사이다전용과 동시용으로 구입 할 수도 있겠다.
class 캔 {}
class 콜라캔 extends 캔 {}
class 사이다캔 extends 캔 {}
class ContraVarianceTest {
public static void main(String[] args) {
수거함<콜라캔> 콜라캔수거함 = new 수거함<>();
수거함<사이다캔> 사이다캔수거함 = new 수거함<>();
수거함<캔> 캔수거함 = new 수거함<>();
콜라캔수거하기(캔수거함, new 콜라캔());
콜라캔수거하기(콜라캔수거함, new 콜라캔());
사이다캔수거하기(캔수거함, new 사이다캔());
사이다캔수거하기(사이다캔수거함, new 사이다캔());
캔수거하기(캔수거함, new 콜라캔());
캔수거하기(캔수거함, new 사이다캔());
//불법캔투기(콜라캔수거함, new 사이다캔());
//불법캔투기(사이다캔수거함, new 콜라캔());
}
public static void 콜라캔수거하기(수거함<? super 콜라캔> 통, 콜라캔 버릴캔) {
통.캔넣기(버릴캔);
}
public static void 사이다캔수거하기(수거함<? super 사이다캔> 통, 사이다캔 버릴캔) {
통.캔넣기(버릴캔);
}
public static void 캔수거하기(수거함<캔> 통, 캔 버릴캔) {
통.캔넣기(버릴캔);
}
/*public static void 불법캔투기(수거함<? extends 캔> 넣을수거함, 캔 버릴캔) {
넣을수거함.캔넣기(버릴캔);
}*/
}