2011-10-31 15 views
1

Java 컴파일러가이 줄의 코드를 신뢰하지 않는 이유가 궁금합니다.일반 콜렉션에는 경고가 필요하지 않습니까?

List<Car> l = new ArrayList(); 

그리고 형식화 된 ArrayList가 있어야합니다.

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

실제로 컴파일러는 첫 번째 경우에 검사되지 않은 할당을 나타냅니다.

컴파일러가이 ArrayList()가 방금 생성 되었기 때문에 왜 'Car'가 아닌 다른 객체를 찾을 수 없습니까?

이 경고는 유형이 지정되지 않은 ArrayList가 이전에 생성되었지만이 경우에는 생성되지 않으면 의미가 있습니다 ...

실제로 List는 'Car'로 입력되므로 모든 미래 "l.add ('object ')'는 'object'가 'Car'인 경우에만 허용됩니다. 그래서, 놀랍지도 않을 겁니다.

내가 틀렸어?

고맙습니다

+1

가능한 복제본 [Java 7에서 다이아몬드 연산자의 요점은 무엇입니까?] (http://stackoverflow.com/questions/4166966/what-is-the-point-of-the-diamond-operator-in -java-7) – Thilo

+0

실제로 질문은 매우 비슷합니다. 나는 그것을 보지 못했다. 고마워. – Mik378

답변

4

왜 ArrayList의()가 방금 생성 된 것을 볼 수 컴파일러하지 않습니다 그래서 그것은 이미 '자동차'이외의 물체를 발견하는 것은 불가능?

간단한 대답은 "은 (는)으로 허용되지 않습니다."입니다.

컴파일러는 Java 언어 사양을 구현해야합니다. 어떤 컴파일러 작성자가 컴파일러에게 "모든 사람"이 안전하다는 것을 알기 위해 많은 스마트 기능을 추가하면 실제로 수행 할 수있는 것은 이식성 문제를 도입하는 것입니다. 이 컴파일러로 컴파일 및 테스트 된 코드는 바보 (또는보다 정확하게는 철저히 준수하는) Java 컴파일러로 컴파일 할 때 컴파일 오류를 발생시킵니다.

그럼 왜 JLS가 이것을 허용하지 않습니까? 몇 가지 가능한 설명을 생각해 볼 수 있습니다.

  • JLS 작성자는이를 사양에 추가 할 시간이 없었습니다. 예 : 나머지 사양에 대한 모든 파급 효과를 고려해야합니다.
  • JLS 작성자는 소리을 사양에서 표현할 수 없습니다.
  • JLS 작성자는 실제 컴파일러에서 구현할 수 있는지 확실하지 않은 사양에 뭔가를 넣고 싶지 않았습니다 ... 컴파일러 작성자에게 너무 부담스럽지 않습니다.

그리고 컴파일러 같은 검사를 구현할 수 있는지 여부 관련 질문이 있습니다. 저는 그 대답에 자격이 없습니다 ...하지만 상상할 수있는만큼 해결할 필요가 없다는 것을 깨닫기에는 문제에 대해 충분히 알고 있습니다.

+0

분명히 이것을 구현할 수 있습니다 (즉, 제네릭을 추가하여이 문제를 "수정하는"전 처리기를 작성할 수는 있지만) 확실히 컴파일러를 복잡하게 만듭니다. 나는. 임의의 함수 등에서 반환 된 원시'LinkedList '를 가지기 때문에 분명히 그 객체가 어디서 왔는지 또는 무엇인가를 구별 할 필요가 있습니다. 분명히 그 특권을 가져서는 안됩니다. – Voo

+0

전처리기를 사용하여이 문제를 "수정"하는 것을 권장하지 않습니다. 처음에는 코드가 실제로 Java가 아니라는 것을 의미합니다. 재 : 컴파일러의 복잡, 그건 사실입니다. 이제 이러한 규칙을 Java 언어 사양으로 변환해야한다고 상상해보십시오. –

+0

그것은 내 요점이 아니 었습니다. 단순히 전처리 기가 실행되면서 쉽게 고칠 수 있다면 컴파일러 (마지막 단락)에 구현할 수 있다고 말하고 있습니다. 컴파일러에 직접 구현하는 것은 가능하지만, 사용하는 파서의 종류에 따라 달라집니다. – Voo

2

(주석으로이 글을 쓰는 것은 정말 성가신 죄송 될 것 주로하기 때문에) 스티븐 C의 정말 좋은 답변에 추가하려면,이 문제가 실제로 명시 적으로 JLS에서 언급 한 :

토론

변수 유형의 매개 변수 인스턴스 인 의 값에서 원시 유형의 값을 지정할 수 있습니다.

예를 들어, 하위 유형 지정 규칙 (§4.10.2)을 기반으로 벡터에 Vector<String>을 지정할 수 있습니다.

Vector<String>에 벡터에서 역 할당 레거시와 인터페이스 을 가능하게하기 위해 선택하지 않은 변환 (§5.1.9)를 사용하여 허용 ( 이후 원료 벡터가 다른 요소 유형이 있었다 수) 안전하지 않은,하지만 여전히 암호. 이 경우 컴파일러에서 경고를 발행합니다.

왜 특별한 경우가 아니 었습니까? 구현에 특수한 경우를 추가하는 것은 여러분이 할 필요가없는 경우에 당신이 할 일이 아니며 "정확한"해결책이 특별한 문제를 추가하지 않기 때문에 (아마도 너무 중요하다고 생각하지 않은 약간의 글쓰기 노력을 제외하고) .

또한 모든 특별한 경우는 컴파일러가 더 복잡해진다는 것을 의미합니다 (적어도 일반적으로 말하면이 경우 확실히). javac이 얼마나 단순한지를 고려하면 간단하고 빠르며 컴파일러도 디자인 목표 중 하나였습니다.

관련 문제