2010-07-30 7 views
3

저는이 프로그램을 제 식식으로 사용합니다. 그리고 만약 내가 JDK 1.5 (빌드 경로 -> 빌드 경로 -> java compilern -> JDK compliance -> 컴파일러 컴플라이언스 레벨 = 1.5)를 컴파일하면, m1 메소드의 타입 삭제 오류가 발생한다.메소드에 동일한 유형의 삭제가 있습니다

나는 옵션이있다. (빌드 경로 -> 빌드 경로 구성 -> java 컴파일 -> JDK 컴플라이언스 -> 컴파일러 컴플라이언스 레벨 = 5) 컴파일러 컴플라이언스 레벨을 5로 낮추면이 오류가 발생하지 않습니다.

제가 선택한이 설정에는 아무런 차이가 없습니다. 하지만 왜 오류가 발생합니까? 뭐죠 모든 해답의 차이가

import java.util.*; 
class TestWrapper 
{ 
public static void main(String[] args) { 
      List<Number> ls1 = new ArrayList<Number>(); 
      List<String> ls2 = new ArrayList<String>(); 
      m1(ls1,ls2); 
     } 
     public static void m1(List<Integer> l1,List<Integer> l2){}    
     public static void m1(List<Number> l1,List<String> l2) {} 

1.5 5 사이의 감사 자바 :

+0

어떤 Eclipse 버전을 사용하고 있는데 어느 곳에서나 5 단계 준수 옵션을 찾을 수 없습니다. 그들은 모두 1.x입니다. 준수 수준 1.5와 5는 이름 지정 체계를 1.5에서 5로 변경했기 때문에 동일한 것이어야합니다 (그리고 1.6으로 동등한 6까지 움직였습니다). –

+0

이 시나리오에 대한 오류가있는 "버전 : Helios Release Build ID : 20100617-1415"버전을 사용하고 있습니다.이 파일은 어제 이클립스 웹 사이트에서 다운로드 한 최신 버전입니다. 나는 당신이 말하는 것을보고, 당신은 드롭 다운을하지 않습니다. 심지어 이클립스 버전에서는 5가 표시되지 않습니다. 하지만 제 동료들은 "버전 : 3.3.0 빌드 ID : I20070625-1500"을 사용합니다. 오류가 발생하지 않고 드롭 다운 값이 5 인 곳 – Java

+0

이 링크는 https://bugs.eclipse.org/bugs/에 도움이됩니까? show_bug.cgi? id = 320514 – Java

답변

3

자바의 제네릭은 "유형 삭제"라는 방법을 사용하여 구현됩니다. 기본적으로 컴파일러는 숨겨진 캐스트를 삽입하고 제네릭 클래스의 이름에서 해당 유형을 제거합니다. 따라서 일단 코드가 컴파일되면 List<Integer>List이됩니다. List<Number>List<String>과 동일합니다. 두 개의 public static void m1(List, List) 방법으로 끝날 것입니다.

에서 작동하지 않아야합니다. Java 컴파일러; 그게 왜 허용 될지 조금은 신비입니다.

+0

답변 해 주셔서 감사합니다. 나는 JDK가 무엇으로 설정되어 있는지, 또는 실제로 그것을 발견하는 방법을 모른다는 것을 모른다. 나는 컴플라이언스 레벨을 5로 선택했을 때 JDK 1.5 또는 JRE 5라고 생각했습니다. 내가 틀렸습니까? 나는 환경을 설정하고 있으며 여기 동료들은 그것을 5로 가지고있다. 나는 compilance level을 1.5로 설정하고 싶다. 이클립스 빌드 경로 -> 컴파일러에서이 컴파일 수준은 무엇입니까? 나는 혼란 스럽다 !!! – Java

+1

메소드 오버로드 선택은 컴파일 타임에 수행되므로 런타임시 발생하는 문제는 중요하지 않습니다. –

+2

유형 삭제는 컴파일시에도 수행됩니다. erasure를 입력하면 동일한 두 가지 메소드가 제공됩니다. 작동중인 Java 컴파일러에서는 작동하지 않습니다. – cHao

0

IMO 어떤 경우에도 오류가 발생합니다. 컴플라이언스 레벨 "5"에 대해 구성된 JDK가 무엇인지 확인할 수 있습니까

+0

JDK가 설정되어 있는지 또는 실제로 발견 된 것인지 알 수 없습니다. 나는 컴플라이언스 레벨을 5로 선택했을 때 JDK 1.5 또는 JRE 5라고 생각했습니다. 내가 틀렸습니까? 나는 환경을 설정하고 있으며 여기 동료들은 그것을 5로 가지고있다. 나는 compilance level을 1.5로 설정하고 싶다. 이클립스 빌드 경로 -> 컴파일러에서이 컴파일 수준은 무엇입니까? 나는 혼란 스럽다 !!! – Java

관련 문제