Generics(2)
3. 지네릭 클래스의 객체 생성과 사용
-
Box< T >의 객체를 생성할 때 참조변수와 생성자에 대입된 타입(매개변수화된 타입)이 일치해야 함 (상속관계에 있어도 불가능)
-
단, 두 지네릭 클래스의 타입이 상속관계에 있고, 대입된 타입이 같은 것은 괜찮음
Ex)
Box<Apple> appleBox = new Box<Apple>( ); // 가능
Box<Apple> appleBox = new Box<>( ); // JDK1.7부터 추정이 가능한 경우 타입 생략 가능
Box<Fruit> appleBox = new Box<Apple>( ); // 에러
Box<Apple> appleBox = new FruitBox<Apple>( ); // OK. 다형성
4. 제한된 지네릭 클래스
- 지네릭 타입에 'extends'를 사용하면, 특정 타입의 자손들만 대입할 수 있게 제한할 수 있음
- 클래스가 아니라 인터페이스를 구현해야 한다는 제약이 필요해도 extends사용 (implements아님)
- 특정 클래스의 자손들만 대입하고 인터페이스도 구현해야 한다면 '&'기호로 연결
Ex)
class FruitBox<T extends Fruit> {
ArrayList<T> list = new ArrayList<T> ( );
}
interface Eatable { }
class FruitBox<T extends Eatable> { ... }
class FruitBox<T extends Fruit & Eatable> { ... }
5. 와일드 카드
- static메서드에는 타입 매개변수 T를 매개변수에 사용할 수 없으므로, 지네릭스를 적용하지 않던가, 타입 매개변수 대신, 특정 타입을 지정해줘야 함
- 하지만 타입을 고정해놓으면 해당 타입의 매개변수만 사용할 수 있다.
- 지네릭 타입은 컴파일러가 컴파일할 때만 사용하고 제거해버리기 때문에 오버로딩이 성립하지 않는다
=> '와일드카드'로 해결 가능
Ex)
<? extends T> // 와일드 카드의 상한 제한. T와 그 자손들만 가능
<? super T> // 와일드 카드의 하한 제한. T와 그 조상들만 가능
<?> // 제한 없음. 모든 타입이 가능. <? extends Object>와 동일
java의 정석 chapter12
Author And Source
이 문제에 관하여(Generics(2)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@roghabo/Generics2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)