
우리가 사용하는 ArrayList 에 < E > 라고 작성이 된 부분이 제네릭의 형태이다.
이를 타입매개변수 라고 하는데, 말그대로 타입을 매개변수처럼 받아 쓴다는 의미다.
외부에서 받은 매개변수타입을 통해 다형성을 실현할 수 있다.
제네릭 타입이 없다면 ArrayList 를 구현할때 Integer타입 ,, String타입 ,,등등 종류별로 다 만들어야 하니까 소스코드가 엄청 커질 것이다.

(원시 타입은 타입으로 줄 수 없음 like int , boolean 등..)

T라는 명칭을 이용해서 List와 같은 기능을 하는 제네릭 클래스를 만들었다.
(참고로 위의 E 나 T 같은 명칭은 자유롭게 사용해도 된다.)
하지만 관례적인 사용을 따르는 것이 좋다.

그리고 이렇게 사용을 하면 된다.
위에서는 String이라는 타입을 제네릭 타입매개변수로 주었기 때문에
컴파일하게 되면 아래와 같은 형태가 되는 것이다.

기존의 다형성 관계(상속 관계)에 있는 대상들도 처리할 수 있다.

먼저 Number 타입을 제네릭 매개변수로 주어 새로운 리스트를 만들었다.
그 안에 각각 int , double , long 형 데이터를 추가했다.
(원래 원시타입은 적용되지 않으나, wrapping 된 것으로 보임)
Number add1 = new Integer(12);
Number add2 = new Double(23.5);
Number add3 = new Long(509325029301235);
이런식으로 부모 = 자식 을 통한 업캐스팅이 유효하다는 의미이다.
다운캐스팅도 가능하지만 이 경우 형변환 에러가 발생할 수 있다.
예로 num4 의 경우 Long형의 데이터를 Double로 다운 캐스팅 할 수 없으니 에러가 발생한다.

https://st-lab.tistory.com/153 (Stranger's LAB 님의 티스토리)