이제 generics에 대해서 이해해보는 테스트를 해보자. 다음 부분 코드는 적법한 형식일까?
첫번째 라인은 확실하게 문법에 맞다. 문제에서 햇갈리는 부분이 2번째 라인이다. 이것은 문제를 일으키는 부분으로 String의 리스트인지, Object 리스트인지 어렵게 한다. 대부분의 사람은 본능적으로 옳다고 이야기 할 것이다.List<String> ls = new ArrayList<String>(); // 1
List<Object> lo = ls; // 2
다음 몇 라인을 확인해보자.
lo.add(new Object()); // 3
String s = ls.get(0); // 4: Attempts to assign an Object to a String!
여기에서 ls와 lo라는 앨리어스를 가지고 있으며, ls에 접근할때는 String의 리스트라는것을 알 수 있으며, lo 에는 변경가능한 객체를 입력할 수 있다. ls의 결과로 더이상 String만을 저장하지 않는다. 그리고 우리는 특정 결과를 획득을 시도하면, 무언가 나올 것이지만 그것은 매우 잘못된 결과가 나오게 된다.
Java 컴파일러는 이러한 결과를 당연히 막아준다. Line 2는 컴파일 타임에서 에러가 날 것이다.
general에서 Foo가 Bar의 하위 타입이라고 하고, G가 generic 타입으로 선언되었다면, 이것은 G<Foo>케이스가 아니라. G<Bar>의 서브타입이 된다. 이것은 아마도 generics에 대해서 매우 열심히 공부를 해야한다는 것을 나타낸다. 왜냐하면 이것은 우리가 가지고 있는 직관력의 내면에 대해서 다루기 때문이다.
우리는 컬렉션이 변경되지 않는다고 가정할 수 없을 것이다. 우리의 본능은 불변의 것이라고 우리를 생각하게끔 만든다.
예를 들어 자동차 상점에 운전자의 선호도 조사에 대한 보고서를 제공한다고 할때, 이것이 합리적으로 보일 것이다. 우리는 List<Driver>가 List<Person>이라고 생각한다. Driver가 Person의 서브타입일 경우에 말이다. 사실 driver의 등록 정보가 복사되어 전달 된다. 반면 선호도 조사에서 운전자가 아닌 새로운 사람이 등록될 수 있을 것이다. 이럴경우 리스트의 레코드는 깨진다.
'WEB_Programming > Pure Java' 카테고리의 다른 글
JAVA + SSL Tutorial (server and client examples) (0) | 2009.11.05 |
---|---|
Generics > Defining Simple Generics (0) | 2008.11.06 |
Generics > Introduction (0) | 2008.11.06 |
Regular Expression > Methods of the PatternSyntaxException Class (0) | 2008.11.06 |
Regular Expression > Methods of the Pattern Class (0) | 2008.11.06 |