나는 JLS 또는 JavaC 버그 (확실하지 않음)의 이상한 점을 발견했습니다. 다음 내용을 읽고 적절한 경우 JLS 통행 또는 Sun Bug ID를 설명하는 설명을 제공하십시오.오버로드 된 패키지 - 개인 메서드로 인해 컴파일 오류가 발생합니다. -이 오류는 JLS 기괴 또는 javac 버그입니까?
- API - - 생각 서블릿 API
- IMPL - - API를 구현을 정의 - 프레임 워크 API를 정의
가정하자 나는 3 "모듈"의 코드로 인위적인 프로젝트가 톰캣 서블릿 컨테이너
생각
: -
- 앱 응용 프로그램은 내가 여기
각 모듈의 클래스입니다 썼다 0
API - MessagePrinter.java
package api;
public class MessagePrinter {
public void print(String message) {
System.out.println("MESSAGE: " + message);
}
}
API - MessageHolder.java
(예, 그것이 "IMPL"클래스를 참조 - 더 나중에에)
package api;
import impl.MessagePrinterInternal;
public class MessageHolder {
private final String message;
public MessageHolder(String message) {
this.message = message;
}
public void print(MessagePrinter printer) {
printer.print(message);
}
/**
* NOTE: Package-Private visibility.
*/
void print(MessagePrinterInternal printer) {
printer.print(message);
}
}
IMPL - MessagePrinterInternal.java
-이 클래스는 API 클래스에 따라 달라집니다. 이름에서 알 수 있듯이, 이것은 내 작은 프레임 워크의 다른 곳에서의 "내부"사용을위한 것입니다. 마지막으로
package impl;
import api.MessagePrinter;
/**
* An "internal" class, not meant to be added to your
* application classpath. Think the Tomcat Servlet API implementation classes.
*/
public class MessagePrinterInternal extends MessagePrinter {
public void print(String message) {
System.out.println("INTERNAL: " + message);
}
}
, 앱 모듈의 유일한 클래스 ... MyApp.java
import api.MessageHolder;
import api.MessagePrinter;
public class MyApp {
public static void main(String[] args) {
MessageHolder holder = new MessageHolder("Hope this compiles");
holder.print(new MessagePrinter());
}
}
그래서, 지금은 내 작은 응용 프로그램, MyApp.java을 컴파일 시도합니다. 내 API 항아리가 항아리, 예를 들어 api.jar를 통해 내보내졌고 좋은 시민이되었다고 가정합니다. Impl 클래스가 impl.jar에 포함되어 있지 않고 내 클래스 패스의 항아리 만 참조했습니다.
이제 API 클래스에는 "내부"구현 클래스에 대한 종속성이 없어야한다는 점에서 분명히 내 프레임 워크 디자인의 결함이 있습니다. 그러나 놀라운 점은 MyApp.java가 전혀 컴파일되지 않았다는 것입니다.
javac -cp api.jar src\MyApp.java
src\MyApp.java:11: cannot access impl.MessagePrinterInternal class file for impl.MessagePrinterInternal not found
holder.print(new MessagePrinter());
^
1 error
컴파일러가 메서드 오버로드로 인해 print() 버전을 사용하려고하면 문제가 발생합니다. 그러나 컴파일 오류는 다소 예기치 않은데, 그 중 하나가 package-private이므로 MyApp에 표시되지 않습니다.
javac 버그입니까, 아니면 JLS의 이상한 점입니까?
컴파일러 : 썬 javac의 1.6.0_14
"연산자 오버로드로 인해"는 "오버로드로 인해 메소드가 오버로드되어" – TofuBeer
이 수정되었습니다. - 감사합니다. – noahlz