2017-12-05 3 views
0

나는과 같이 목록을 만들 수 있도록하려면 -이유는이 라인은 목록을 <Object>리터를 컴파일러하지 않습니다 = 새로운 ArrayList를 <String>()?

List<Object> l = new ArrayList<String>(); 

ArrayList의 표준 라이브러리 구현이 허용하지 않습니다. 컴파일 시간 오류가 발생합니다. 그래서 ArrayList 내 자신의 구현을 쓰고 있어요. 컴파일되지 않는

public class ArrayList<Y extends X> implements List<X> {...} 
public class ArrayList<X super Y> implements List<X> {...} 

-

은 지금까지 나는이 시도했다. 그래서

, 어떻게 내가 위에서 언급 한 것처럼 사용할 수있을 것 ArrayList에 쓸 수?

List<Object> l = new ArrayList<String>(); 

사용자는이 소식 Is List<Dog> a subclass of List<Animal>? Why aren't Java's generics implicitly polymorphic?

을 지적하지만 난 여전히 이해가 안 돼요.

List<Object> l = new ArrayList<String>(); 
l.add(new Dog()); 

이 의미가 있지만, 내가 런타임에서 예외를 throw에 불과 컴파일 자바 배열을 가진 것은 비슷한 종류의 작업을 수행 할 수 있습니다 - 주어진 이유는 우리가 지금과 같은 상황을 피하려는 것이 었습니다.

Object o[] = new String[10]; 
o[0] = new Dog(); 

그렇다면 후자의 코드를 컴파일 할 수있게 해주는 이유는 무엇입니까?

편집은 - 위에 표시된대로 비슷한 질문은 이미 요청했습니다. 이 질문은 Why is the ArrayStoreException a RuntimeException?

+2

왜 링크 된 질문 귀하의 질문에 대답하지 않습니다에 대한 참조? Java가 이러한 종류의 구문을 지원하지 않는 이유를 설명합니다. 그렇지 않다면 정확히 무엇을 달성하고 싶습니까? 'new ArrayList ()'을 쓰면리스트는 ** 오직'String'과 그 서브 타입을 받아 들일 것입니다. 대신'new ArrayList ()'을 쓰면 원하는 모든 것을 추가 할 수 있습니다. – Zabuza

+0

런타임에 컴파일 오류보다 예외가 발생한다고 말하는가? 그건별로 의미가없는 것처럼 보입니다. – Marvin

+0

아니요, 그 말은 아닙니다. 나는 그저 이것에 대한 이유가 무엇인지 묻는다. –

답변

0

당신은 단지

List<Object> l = new ArrayList<Object>(); 

유형의 매개 변수는 컴파일 타임에 존재 쓸 수 있습니다 때문에,이 차이는 없습니다.

2

귀하의 링크 말한다 것처럼, 지금처럼 List을 정의

List<? extends Object> l = new ArrayList<String>(); 

편집

예,

List<? extends Object> l = new ArrayList<String>(); l.add("asda"); 

이 작동하지 않는 이유 것은 런타임을 방지하는 것입니다 예외, 아무것도 그래서 컴파일러로 취급 Object을 확장하고 목록의 유형이 될 수 있기 때문에 그러한 (아무것도/알 수 없음). 원본에 대한 참조를 유지하는 경우 그러나 당신은 여전히 ​​목록을 편집 할 수 있습니다.

List<String> strList = new ArrayList<>(); 
List<? extends Object> objList = strList; 
strList.add("asdf"); 
// Will return Strings that only have the Object interface 
Object o = objList.get(0); 

이 또한 필요 List<? extends Object>의 목적은, 코드를 제네릭에 대한 유형 보장제 (일부 유형이 경우 Object 확장) 및 컴파일러, 감사를주고 그냥 컴파일시 해당 조건을 보장 할 수 있지만, 원래 목록을 위반하지 않았는지 확인하십시오.예를 들어 다음과 같은 코드를 가지고 다음 objList이 유형이기 때문에

List<Integer> intList = new ArrayList<>(); 
List<? extends Object> objList = intList; 
// compile error to protect the original list 
objList.add("asdf"); 

그래서 당신이 그것을에 String를 추가 할 수 없습니다 ?. StringObject의 하위 클래스이지만 ?과 동일한 유형 (이 경우는 아님) 일 수 없습니다.

유형 삭제로 인해 런타임에 제네릭 유형이 없어 졌음을 잊지 마십시오. Generics는 컴파일 타임을 보장합니다.

또한 이제 귀하의 진정한 질문을 봅니다.

이유는 같은 경우 배열에 허용되어 있습니다. 왜 그런 경우 시간 오류를 컴파일하지 않습니까? 기본적으로 내가 무엇을 요구하는 이유는 우리가 배열과 generic ArrayList에 대한 다른 정책에 대해이 이중 정책을 갖는 이유일까요?

this 질문 및 관련 답변

+0

'List l = new ArrayList (); ' 'l.add ("asda");'여전히 작동하지 않습니다. –

관련 문제