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 매개 변수는 다른 제네릭 유형과 마찬가지로 한정 될 수 있습니다. 다음과 같이 와일드 카드 참조를 선언 할 수도 있습니다.
그러나이 참조를 사용할 수있는 방법은 없습니다. 이 메서드를 호출하려는 모든 시도가 실패합니다.
와일드 카드와 호환되는 것은 없습니다. 전달하려는 매개 변수가 method()
없습니다 Object
. 불행히도 와일드 카드의 상한조차도 도움이되지 않습니다.
오류는 람다식이 매개 변수의 정확한 유형만을 취한다는 것을 보여줍니다. 유연성이 없습니다. 공분산은 없다.
하한은 묶여 method()
있는 객체로 호출 될 수 있기 때문에 조금 더 유용합니다 .
그러나 경계의 상위 유형이 더 이상 작동하지 않습니다. 매개 변수는 람다 표현식 유형과 정확히 일치해야합니다. 이 경우, 그것은있을 것이며 ?
, 그런 대상이 없다 ? super
.
때문에 이러한 규칙, 우리는 일반적인 람다는 말할 수 불변 자신의 유형 매개 변수에 대한.
요약 : 람다 표현식 (메소드 호출과 마찬가지로)은 서명, 결과 유형 및 예외 사양에 대해 공변입니다. 일반 람다 유형 (기능 인터페이스)은 유형 매개 변수에 대해 변하지 않습니다.
결론
공분산 및 반항은 형식 종속 언어 요소의 호환성 또는 비 호환성을 나타냅니다. Java에서 배열 유형은 암시 적으로 공변수이며 명시 적으로 반 변형입니다 (유형 변환 또는 캐스팅을 통해). 매개 변수화 된 (generic) 유형은 내재적으로 불변하며 형식 변환에서는 변경되지 않습니다. 와일드 카드 바인딩을 통해 매개 변수화 된 유형에 대한 공분산 및 반항성을 선언 할 수 있지만 상한값 ( <? extends Bound>
)과 하한값 ( ) 을 통한 공분산을 선언 <? super Bound>
합니다. 와일드 카드 유형은 추상적이며 참조 용으로 만 사용할 수 있습니다.
메소드 호출은 서명 및 결과 유형에 관한 선언 및 정의와 공변합니다. 메소드 선언과 정의는 서명과 결과 유형에 관한 공변 (covariant)에 대해 서로 불변합니다.
표 3은 Java의 유형 종속성 및 분산에 대한이 논의를 요약합니다.
표 3. Java의 차이
불변량 | 공변량 | 반항적 인 | |
배열 유형 | 절대적인 | 노골적인 : 캐스팅 | |
일반 유형 | 절대적인 | 명백한: | 명백한: |
메소드 | 서명 | 결과 유형 | |
메소드 | 서명과 | ||
람다 | 유형 매개 변수 | 서명과 |
이 이야기 인 "Java의 유형 종속성, 제 2 부"는 원래 JavaWorld에서 출간 되었습니다.
'DevOps' 카테고리의 다른 글
Java 101 : 필수 Java 언어 기능 둘러보기, 1 부-3장 assertions and generics (0) | 2017.06.14 |
---|---|
Java 101 : 필수 Java 언어 기능 둘러보기, 1 부-2장 assertions and generics (0) | 2017.06.14 |
Java 101 : 필수 Java 언어 기능 둘러보기, 1 부-1장 assertions and generics (0) | 2017.06.14 |
Java의 유형 종속성, 2-2 (Collections API, 제네릭, 람다식 활용) (0) | 2017.06.14 |
Java의 유형 종속성, 2-1 (Collections API, 제네릭, 람다식 활용) (0) | 2017.06.14 |
Java에서 유형 종속성, Part 1-2 (array, generic, wildcard) (0) | 2017.06.14 |
Java에서 유형 종속성, Part 1-1 (array, generic, wildcard) (0) | 2017.06.14 |