2016-08-16 2 views
0

Java에서 타입 지우기 이론에 따르면, 다음 두 코드 조각이 동일한 자바 클래스로 컴파일되어야하므로 동일한 바이트 코드를 가져야한다고 생각합니다.자바 일반 <T> 일반?

public class Generic { 
    private Object t; 

    public void hi() { 
     System.out.println(t); 
    } 
} 

javac의 Generic.java

MV Generic.class Generic1.class

public class Generic<T> { 
    private T t; 

    public void hi() { 
     System.out.println(t); 
    } 
} 

javac의 Generic.java

MV Generic.class Generic2.class

은 Generic1.class와 Generic2.class를 비교하면 완전히 다릅니다.

내 생각에 무엇이 잘못 되었나요? 그리고 Generic이 바이트 코드를 컴파일하는 방법은 무엇입니까?


[EDIT]

은 javap -v 좋은 팁 감사합니다.

그러나 짧은 시간에 바이트 코드로 세부적인 내용을 이해할 수는 없습니다.

Generic이 T erase to Object로 컴파일되는지 알고 싶습니다.

+0

@ElliottFrisch 당신이 언급 한 그 여분의 캐스트를 보지 못했습니다 - 출력을 'diff'하면 상수 만 제공됩니다 (즉, 해시로 시작하는 것이 맞나요?). 그래도 javap -v를위한 좋은 팁! – Alec

답변

1

여기 클래스의 메소드는 바이트 코드과 동일하지만 클래스 파일에 바이트 코드 만있는 것은 아닙니다.

클래스 파일에는 클래스의 수퍼 클래스 및 구현 인터페이스, 해당 메서드의 매개 변수와 반환 형식, 해당 필드 형식 등 클래스 및 해당 멤버의 선언이 포함되어 있습니다. 이러한 선언은 모두 generics를 유지합니다 나중에이 클래스에 대해 별도로 컴파일 된 클래스를 확인할 수 있습니다. 따라서 클래스 파일은 다릅니다.

0

유형 삭제 (삭제를 입력하지) 같은 바이트 코드가됩니다 두 가지 예를 의미하지 않는다, 당신이 유형을 할 수 있다면 제네릭이 아닌 기존 유형 수동 캐스트 또는 컴파일러가 그것을 할 것을 기본적으로 의미 매개 변수화 된 유형 (런타임 오버 헤드 없음)에서 사용할 수 있습니다.

+0

사실, 클래스는 같은 바이트 코드를 갖습니다. 그러나 클래스에 'T'가 반환되면 클래스를 사용하는 코드는 동일한 바이트 코드를 가질 수 없습니다. 이 경우에는 'T'유형이 공개 인터페이스에 나타나지 않기 때문에이 경우에 해당합니다. – newacct