Item 31 - 한정적 와일드카드를 사용해 API 유연성을 높이라
매개변수화 타입은 불공변이다. List<Object>는 List<String>의 하위 타입도 상위 타입도 아니다. List<String>은 List<Object>가 하는 일을 제대로 수행하지 못한다. 리스코프 치환법칙에 어긋난다. (아이템 10) 때로는 불공...
매개변수화 타입은 불공변이다. List<Object>는 List<String>의 하위 타입도 상위 타입도 아니다. List<String>은 List<Object>가 하는 일을 제대로 수행하지 못한다. 리스코프 치환법칙에 어긋난다. (아이템 10) 때로는 불공...
제네릭 메서드 메서드도 제네릭으로 만들 수 있다. 매개변수화 타입을 받는 정적 유틸리티 메서드는 보통 제네릭 메서드이다. ex. Collections의 binarySearch, sort 메서드 // 메서드 선언에서 입력 2개와 반환 1개의 원소 타입을 타입 매개변수로 명시 // (타입 매개변수들을 선언하는) 타입 매개변수 목록은 메서드...
아이템 7에서 다룬 스택 코드 이 클래스는 원래 제네릭 타입이어야 마땅하다. // Object 기반 스택 - 제네릭이 절실한 강력 후보! public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INI...
배열과 제네릭의 차이 1) 배열은 공변, 제네릭은 불공변이다. 배열 : Sub가 Super의 하위타입이면 배열 Sub[]는 배열 Super[]의 하위타입이다. 제네릭 : 서로 다른 T1, T2가 있을 때, List<T1>는 List<T2>의 하위타입도 상위타입도 아니다. // 배열 : 런타임에 실패한다. Object...
제네릭을 사용하면 수많은 컴파일러 경고를 볼 수 있다. (비검사 경고) ex. 비검사 형변환 경고, 비검사 메서드 호출 경고, 비검사 매개변수화 가변인수 타입 경고 등 비검사 경고 예시 Set<String> words = new HashSet(); 위 코드에서는 다음과 같은 경고를 볼 수 있다. Raw use of parame...
클래스와 인터페이스 선언에 타입 매개변수가 쓰이면, 제네릭 클래스 혹은 제네릭 인터페이스라 한다. 또 이들을 통틀어 제네릭 타입이라고 한다. 로 타입(raw type) 제네릭 타입을 하나 정의하면 그에 딸린 로 타입(raw type)도 함께 정의된다. 제네릭 타입에서 타입 매개변수를 사용하지 않을 때를 로 타입이라고 한다. ...
소스 파일 하나에 톱레벨 클래스를 여러 개 선언하더라도 자바 컴파일러는 불평하지 않는다. 하지만 아무런 득이 없을 뿐더러 심각한 위험을 감수해야 한다. 한 클래스를 여러 가지로 정의할 수 있다. 그 중 어느 것을 사용할지는 어느 소스 파일을 먼저 컴파일하냐에 따라 달라진다. 두 클래스가 한 파일...
중첩 클래스 (nested class) 중첩 클래스는 다른 클래스 안에 정의된 클래스를 말한다. 자신을 감싼 바깥 클래스에서만 쓰여야한다. 정적 멤버 클래스, (비정적) 멤버 클래스, 익명 클래스, 지역 클래스 정적 멤버 클래스 다른 클래스 내부에서 static으로 선언된 클래스 다른 정적 멤버와 똑같은 접근 규칙을 적용받는다...
태그 달린 클래스 두 가지 이상의 의미를 표현할 수 있고, 현재 표현하는 의미를 태그 값으로 알려주는 클래스 public class Figure { enum Shape { RECTANGLE, CIRCLE }; // 태그 필드 - 현재 모양을 나타낸다. final Shape shape; // 다음 필드들은 모양이 사각...
인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 하는데, 인터페이스는 이 용도로만 사용해야 한다. 상수 인터페이스는 메서드 없이 static final 필드로만 가득 찬 인터페이스로, 인터페이스를 잘못 사용한 예이다. public interface PhysicalConstants { static final do...