그래서 JDK 컴파일러는 첫 번째 버전을 컴파일하지만 두 번째 버전은 컴파일하지 않지만 Eclipse 컴파일러는 두 버전을 컴파일하지 않습니다.
Java 바이트 코드의 관점에서, 첫 번째 버전은 형식이 완전히 삭제 된 두 가지 방법, 즉 public java.lang.Boolean test()
과 public java.lang.Double test()
을 포함하고 있으며, 이는 완전히 유효합니다. 제네릭 메서드를 재정의 할 때 JDK 컴파일러와 Eclipse 컴파일러에서 이러한 메서드를 생성하는 경우가 있지만 이러한 메서드는 합성 브리지 메서드로 표시됩니다.
두 번째 버전에는 동일한 서명 (삭제 후)이있는 두 개의 메소드가 포함되어 있으며 Java 바이트 코드에서는 사용할 수 없습니다.따라서 JDK 컴파일러는 이러한 클래스 파일을 생성 할 수 없습니다. 난 그냥 같은 방법으로 클래스를 생성하는 16 진수 편집기와 클래스 파일을 편집하고, 프로그램을 시작하기에,이 오류가 발생합니다 :
Exception in thread "main" java.lang.ClassFormatError: Duplicate method name&signature in class file SameSignatureMethods
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: SameSignatureMethods. Program will exit.
내가 이런 모습으로 시작하는 클래스입니다. 그들은 같은 이름의 길이가 있기 때문에 내가 문자열과 더블을 사용 : 다음
public class SameSignatureMethods {
public <T extends String> String test() {
return null;
}
public <T extends Double> Double test() {
return null;
}
public static void main(String[] args) {
System.out.println(new SameSignatureMethods().<Double>test());
}
}
를 16 진수 편집기를 사용하여, 나는 클래스 파일의 두 장소, 원시 하나에, public <T extends String> Double test()
에 첫 번째 방법의 서명을 변경 서명 ()Ljava/lang/Double;
, 일반 서명 <T:Ljava/lang/String;>()Ljava/lang/Double;
을 포함하는 서명
흠, 흥미로운 것. 어떤 컴파일러를 사용 했습니까? JDK 또는 일부 IDE 내장? 첫 번째 것은 Eclipse 3.6 SR1에서 컴파일되지 않습니다 (올바른 것입니다). – BalusC
java 버전 "1.6.0_18" Java (TM) SE 런타임 환경 (빌드 1.6.0_18-b07) Java HotSpot (TM) 클라이언트 VM (빌드 16.0-b13, 혼합 모드) – Yuriy
@BalusC 반환 유형이 아닙니다. 메서드 서명의 일부입니까? 오류 메시지는 이상합니다. – extraneon