Generic과 다형성 2탄
private void feedAnimals(List<? extends Animal> animals) {
for(Animal animal : animals){
animal.eat();
}
}
위 코드는 아래와 같이 써도 똑같은 의미 입니다. 다른 의미 입니다. 위에 것은 상위 제한이 Animal인 어떠한 타입이든(Dog든 Cat이든 Animal을 상속 받았다면..) 올 수 있는데 아래 것은 상위 타입이 Animal인 어떤 타입 하나(Dog면 Dog, Cat이면 Cat)만 올 수 있기 때문에 콜렉션에 타입 제약을 가할 수 있기 때문에 추가가 됩니다. T 타입으로 추가를 해야겠죠.
private <T extends Animal> void feedAnimals(List<T> animals) {
for(Animal animal : animals){
animal.eat();
}
}
그럼 이런 상황에서 Dog 리스트에 Cat 객체를 넣으려는 건 어떻게 방지가 될까가 궁금합니다. 컴파일러는 위와 같이 ? 나 T 같은 와일드 카드가 사용되면 컴파일러는 콜렉션에 추가하는 작업을 허용하지 않습니다. 1
따라서 다음고 같은 코드를 컴파일 에러를 발생시킵니다.
private <T extends Animal> void feedAnimals(List<T> animals) {
for(Animal animal : animals){
animal.eat();
}
animals.add(new Dog()); //에러
animals.add(new Cat()); //에러
animals.add(new Animal()); //에러
}
하지만 다음과 같이 추가하는 작업을 할 수 있습니다.
for(Animal animal : animals){
animal.eat();
}
// animals.add(new Dog());
// animals.add(new Cat());
// animals.add(new Animal());
animals.add(a);
}
또 하나 여기서 사용된 extends의 의미는 class head부분에서 사용되는 extends보다 포괄적인 의미를 나타냅니다. extends와 implements를 포함합니다.
참조 : Head First Java
좀더 자세한 내용은 Generics를 참조 하세요.
- Java 에서 identifier가 될 수 있는 어떤 문자도 상관이 없습니다. [본문으로]
'Java' 카테고리의 다른 글
제8회 한국 자바 개발자 컨퍼런스 (2) | 2007.01.25 |
---|---|
GC관련 아티클 (0) | 2007.01.19 |
Generics 번외 - 겉모습만 보곤 알 수 없슴. (2) | 2007.01.17 |
Generics (2) | 2007.01.17 |
Eclipse 단축키 모음 (6) | 2007.01.11 |
Generic과 다형성 2탄 (4) | 2007.01.05 |
Generic과 다형성 (0) | 2007.01.05 |
자바 검은 띠에 도전해 보시길~ (2) | 2006.12.31 |
Hiding Method (0) | 2006.12.31 |
Overriding - covariant return type (6) | 2006.12.31 |
LinkedList vs ArrayList (6) | 2006.12.22 |
오 몰랐던 부분이네요.. 이런 사실이
!!!
기선님 위에 코드부분은 수동으로 이렇게 치신건가요?
아니면 플러그인이 있는건가요?
http://realstudy.oranc.co.kr/tt/61
이곳으로 가보시면 설명되어있습니다!
혹시 더 나은 방법이 있다면!! 리플을 !!
zerry82님이 잘 설명해 놨네요.
이클립스에서 워드에 복사해 놓고 다시 그걸 복사해서 붙여 넣으시면 됩니다.
손은 좀 가도 코드 보기가 훨씬 좋네요.