<code>public void testGenerics() {<br> Collection<Number> numbers = new ArrayList<>();<br> numbers.add(1); // ok<br> numbers.add(0.1); // ok<br><br> Collection<? extends Number> numbers2 = new ArrayList<>();<br> // don't work, you don't know which subtype 'numbers2' exactly contains<br> numbers2.add(1); // oops!<br>}<br></code>
로그인 후 복사
이 예는 사실 약간 반인간적입니다. 이런 전환에 대한 대부분의 사람들(나 포함)의 첫 반응은 "당연히 옳습니다"일 것으로 추정됩니다( 이것은 함정입니다), 다음과 같이 말하세요. 내 이해는 다음과 같습니다.
Collection: 이 컬렉션에는 Integer/Long/Float일 수 있는 모든 Number 유형 개체가 포함되어 있음을 나타냅니다. 왜냐하면 컴파일러는 obj 인스턴스of Number ==를 결정할 수 있기 때문입니다. true;
Collection 확장 Number>: 이 컬렉션이 Number 유형의 "하위 유형"(Collection/Collection일 수 있음)의 컬렉션 인스턴스임을 나타냅니다. 따라서 number2.add( 1) 컴파일 때문에 작동하지 않습니다. 컴파일러는 Number2에 포함된 요소가 Number의 어떤 하위 유형인지 알지 못하며, UnknownType의 obj 인스턴스 결과를 확인할 수 없습니다. 이 E 유형은 " 표현이 아닌 특정 유형 부모의 여러 하위 유형에 대한 자리 표시자;