DevOps

Java의 유형 종속성, 2-3 (Collections API, 제네릭, 람다식 활용)

IT오이시이 2017. 6. 14. 10:38
728x90


Type dependency in Java, Part 2

Using covariance and contravariance in your Java programs


원문 : http://www.itworld.com/article/3197118/learn-java/type-dependency-in-java-part-2.html?page=3


일반 람다 식

그들의 방법과는 달리, 기능적 인터페이스는 일반적 일 수 있습니다. 이  Comparator예제에서는 일반적인 기능 인터페이스 인 것을 보았습니다. type 매개 변수는 다른 제네릭 유형과 마찬가지로 한정 될 수 있습니다. 다음과 같이 와일드 카드 참조를 선언 할 수도 있습니다.


@FunctionalInterface
interface GenericFunctionalInterface<T> {
	void method(T t);
}
...
GenericFunctionalInterface<?> wildcardReference;
wildcardReference = (String string) -> System.out.println(string);
wildcardReference = (Integer integer) -> integer++;

그러나이 참조를 사용할 수있는 방법은 없습니다. 이 메서드를 호출하려는 모든 시도가 실패합니다.


wildcardReference.method("Wildcard"); // type error
wildcardReference.method(1); // type error
wildcardReference.method(new Object()); // type error

와일드 카드와 호환되는 것은 없습니다. 전달하려는 매개 변수가 method()없습니다 Object. 불행히도 와일드 카드의 상한조차도 도움이되지 않습니다.


GenericFunctionalInterface<? extends Type> covariantReference;
covariantReference = (Type parameter) -> System.out.println(parameter);
covariantReference.method(new Type(){}); // type error

오류는 람다식이 매개 변수의 정확한 유형만을 취한다는 것을 보여줍니다. 유연성이 없습니다. 공분산은 없다.

하한은 묶여 method()있는 객체로 호출 될 수 있기 때문에 조금 더 유용합니다 .


GenericFunctionalInterface<? super SubType> contravariantReference;
contravariantReference = (SuperType parameter) -> System.out.println(parameter);
contravariantReference.method(new SubType(){}); // compiles well
contravariantReference.method(new SuperType(){}); // type error

그러나 경계의 상위 유형이 더 이상 작동하지 않습니다. 매개 변수는 람다 표현식 유형과 정확히 일치해야합니다. 이 경우, 그것은있을 것이며 ?, 그런 대상이 없다 ? super.

때문에 이러한 규칙, 우리는 일반적인 람다는 말할 수 불변 자신의 유형 매개 변수에 대한.

요약 : 람다 표현식 (메소드 호출과 마찬가지로)은 서명, 결과 유형 및 예외 사양에 대해 공변입니다. 일반 람다 유형 (기능 인터페이스)은 유형 매개 변수에 대해 변하지 않습니다.

결론

공분산 및 반항은 형식 종속 언어 요소의 호환성 또는 비 호환성을 나타냅니다. Java에서 배열 유형은 암시 적으로 공변수이며 명시 적으로 반 변형입니다 (유형 변환 또는 캐스팅을 통해). 매개 변수화 된 (generic) 유형은 내재적으로 불변하며 형식 변환에서는 변경되지 않습니다. 와일드 카드 바인딩을 통해 매개 변수화 된 유형에 대한 공분산 및 반항성을 선언 할 수 있지만 상한값 ( <? extends Bound>)과 하한값 ( ) 을 통한 공분산을 선언 <? super Bound>합니다. 와일드 카드 유형은 추상적이며 참조 용으로 만 사용할 수 있습니다.

메소드 호출은 서명 및 결과 유형에 관한 선언 및 정의와 공변합니다. 메소드 선언과 정의는 서명과 결과 유형에 관한 공변 (covariant)에 대해 서로 불변합니다.

표 3은 Java의 유형 종속성 및 분산에 대한이 논의를 요약합니다.

표 3. Java의 차이

불변량

공변량

반항적 인

배열 유형

 

절대적인

노골적인 : 캐스팅

일반 유형

절대적인

명백한: ? extends

명백한: ? super

메소드 
선언

서명

결과 유형

 

메소드 
호출

 

서명과 
결과 유형

 

람다

유형 매개 변수

서명과 
결과 유형

 

이 이야기 인 "Java의 유형 종속성, 제 2 부"는 원래 JavaWorld에서 출간 되었습니다.

728x90
반응형