class TestMain {
public static void main(String[] args) {
Optional<String> os1=Optional.of("Optional String");
Optional<String> os2=os1.map(String::toUpperCase);
System.out.println(os2.get());
}
}
map 메소드는 다음과 같이 정의되어 있다.
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Optional.ofNullable(mapper.apply(value));
}
}
정의를 통해 T는 제네릭 클래스, U는 제네릭 메소드임을 알 수 있다.
아래는 map 메소드의 제네릭 매개변수의 변환 시점이다.
map 메소드의 정의 부분을 보면 mapper.apply(value) 에서 value는 Optional 클래스의 멤버 변수 private fianl T value; 로 선언되어 있다. 즉, apply(T t)는 value에 의해서 apply(String t)가 되며 String 인스턴스의 참조 값을 반환하면서 U가 String으로 결정 된다. 그럼 여기서 매개변수로 하한제한을, 반환형으로 상한제한을 둔 이유는 무엇일까?
만약 Optional 인스턴스가 각각 Integer, Double로 두 인스턴스가 선언되어 있고 map 메소드의 인자로 전달되는 Function 인스턴스가 특정 기능을 담아 Number 참조형 참조변수로 전달 되었을 때, 상속의 이유와 목적인 "공통적인 규약을 정의"한다는 의미와 같음을 알 수 있으며 extends 선언을 통한 반환형임을 강조하는 의미와 더불어 개발자로 인한 실수를 방지한다.
'Programming > JAVA' 카테고리의 다른 글
Effectively final (0) | 2020.12.11 |
---|---|
Lambda Expression (0) | 2020.12.10 |
Nested Class, Inner Class (0) | 2020.12.08 |
댓글