2013-03-06 4 views
2

요즘 제네릭과 공분산/반항에 대해서는 약간 혼란스러워합니다. 나는 C#이 공변 (covariant)/반 변형 (contravariant) 타입 매개 변수를 지정한다는 것을 알고 있지만 실제로 Java에서 비슷한 개념을 갖고 있습니까?자바 - 공분산과 반항이 존재합니까?

난 당신이 선언 할 수 있습니다 이해 : L2는 List<Object>을하고 여기에 문자열을 추가 할 수 있지만 모든 요소를 ​​얻을 수 있습니다 동안

List<? extends String> l = ... 
List<? super String> l2 =... 

지금 난 등 MyString의 목록을 방법은 허용되지 않습니다 추가 할 수 있습니다, 여기에 설명 된대로 Covariance- contravariance in Java.

Iterable<Animal> a = new Iterable<Dog>(); 

내가 혼란 스러워요 또는 Java 단순히 적절한 공분산 정의를 지원하지 않습니다처럼이, 그러나, 단순히 subtyes/슈퍼 타입을 받아들이는 형식 매개 변수 목록을 선언하고, 일을하지 "적절한"공분산? 감사.

+0

'반복 가능'이어야합니까? Animal> a = new 반복 가능 ();'Dog가 Animal을 확장한다고 가정하고 반복 가능함 ' –

+0

예 - http://stackoverflow.com/questions/2501023/demonstrate-covariance-and-contravariance-in-java – djechlin

+0

Java가 공변 (covariant) 타입의 param을 허용한다면, Iterable을 정확하게 의미한다. – Bober02

답변

-3

Java의 유형 차이는 선언 사이트가 아닌 사용 사이트에 있습니다. 우리가

List<+Animal> animals = new ArrayList<Dog>(); 

유형 변수에 + 주석은 파라미터 화 된 형태의 공변한다 (원래 구문) covariantly 사용할 수 있습니다 우리는 유형 선언을

interface List<E> 

을 말해봐.

전혀 나쁘지 않습니다. 우리는 conterviant List<-Animal>도 가질 수 있습니다. 더 유연합니다.

Java 디자이너는 자바 프로그래머의 어리 석음을 과대 평가했다. 그들은 단일 문자 기호 +/-가 우리를 화나게 할 것이라고 생각한다. 우리는 무슨 일이 일어나고 있는지 이해하기 위해 영어 단어를보아야 만합니다. 그리고 자바에서 여전히 자세한 시간을 축하해야했습니다. 그래서 우리는이 구문을 얻습니다.

List<? extends Animal> 

나는 그것이 완전히 지연된 것 같아요.