Open tonykang22 opened 1 year ago
public interface Entity {
Long getId();
}
public class Account implements Entity {
private Long id;
private String username;
public Account(Long id, String username) {
this.id = id;
this.username = username;
}
@Override
public Long getId() {
return this.id;
}
public String getUsername() {
return username;
}
}
public class AccountRepository {
private Set<Account> accounts;
public AccountRepository() {
this.accounts = new HashSet<>();
}
public Optional<Account> findById(Long id) {
return accounts.stream().filter(a -> a.getId().equals(id)).findAny();
}
public void add(Account account) {
this.accounts.add(account);
}
}
public class Message implements Entity {
private Long id;
private String body;
@Override
public Long getId() {
return id;
}
public String getBody() {
return body;
}
}
public class MessageRepository {
private Set<Message> messages;
public MessageRepository() {
this.messages = new HashSet<>();
}
public Optional<Message> findById(Long id) {
return messages.stream().filter(a -> a.getId().equals(id)).findAny();
}
public void add(Message message) {
this.messages.add(message);
}
}
public class GenericRepository<E extends Entity> {
private Set<E> entities;
public GenericRepository() {
this.entities = new HashSet<>();
}
public Optional<E> findById(Long id) {
return entities.stream().filter(a -> a.getId().equals(id)).findAny();
}
public void add(E entity) {
this.entities.add(entity);
}
}
public class AccountRepository extends GenericRepository<Account> {
}
아이템 26. 로 타입은 사용하지 말라.
핵심 정리: 용어 정리
List
List<E>
List<String>
E
String
List<E extends Number>
Class<?>
Class<? extends Annotation>
핵심 정리
매개변수화 타입을 사용해야 하는 이유
안정성
)표현력
)로 타입
을 사용하면 안정성과 표현력을 잃는다.로 타입
을 지원하는가?List
와List<Object>
의 차이는?List
를 사용하면 타입 세이프하지 않다.List
는 무엇이나 받을 수 있지만,List<Object>
는 무엇이나 받을 수 없다.List
와 마찬가지로, 타입 세이프하지 않다.Set<?>
: 어떤 타입이어도 담을 수 있는 가장 범용적인 매개변수화 Set 타입이다.로 타입
뿐이다. (instatnceof 도 마찬가지이다.)예시
컴파일 타임에 문제를 찾을 수 있다.
Generic을 사용하기 전
에는 컴파일 타임에 문제를 찾을 수 없었으나, 사용 후에는 컴파일 타임에 문제를 찾을 수 있다.제네릭 클래스
제네릭 클래스
BoxBox<E extends Number>
등이 존재할 수 있다.Box<String>
으로는 선언할 수 없다. : 컴파일 에러Box<?>
Box<Object>
를 매개변수로 사용하는 메서드에Box<Integer>
를 인자로 넘겨줄 수 없다.Box<Object>
(컴파일 에러) →Box<? extends Object>
(생략 가능) →Box<?>
자바는 왜
로 타입
을 지원하는가?로 타입
으로 보인다.