ArrayList<? extends Product> list = new ArrayList<Tv>();
ArrayList<? extends Product> list = new ArrayList<Audio>();
제네릭에 다형성을 적용한다.
제네릭 타입 명시를 안 할수도 있는데 해야한다면 제네릭 범위를 2개 이상으로 좁혀두고 싶을 때 사용하는 듯 하다. 예시는 인자로 받는 상황을 보여줬다. page 470
static <T extends Fruit> Juice makeJuice(FruitBox<T> box){
String tmp = "";
for(Fruit f : box.getList()) tmp += f+" ";
return new Juice(tmp);
}
메서드 선언부에 제네릭 타입을 지정할 수 있다.
메서드 제네릭은 제네릭 클래스에 정의된 T와 별개로 지역적으로 사용된다.
메세드 제네릭을 사용하면 static 메서드에 타입을 선언하고 사용할 수 있다.
enum Direction2 {
EAST(1, ">"), SOUTH(2,"V"), WEST(3, "<"), NORTH(4,"^");
private final int value;
private final String symbol;
Direction2(int value, String symbol) { // 접근 제어자 private이 생략됨
this.value = value;
this.symbol = symbol;
System.out.printf("initial : %d=%s\n", value, symbol);
}
public int getValue() { return value; }
public String getSymbol() { return symbol; }
}
class Main {
public static void main(String[] args) {
for(Direction2 d : Direction2.values())
System.out.printf("%s=%d%n", d.name(), d.getValue());
}
}
결과
initial : 1=>
initial : 2=V
initial : 3=<
initial : 4=^
EAST=1
SOUTH=2
WEST=3
NORTH=4
생성자가 private이라는 것도 그렇고 enum을 사용하는 시점에 자동으로 생성되는 듯 하다.
main에서 enum을 사용하지 않으면 초기화x
자바에서 제공하는 표준 annotation
@Override, @Deprecated, @SuppressWarnings, @FunctionalInterface.....
표준 annotaion은 컴파일러에게 유용한 정보를 제공한다. 이름 틀린 Override 잡아주기, 경고 무시, 함수 인터페이스 적절한지 등을 봐준다.