Eclipse가 이것을 컴파일하는 이유는 있지만 Javac은 그렇지 않습니까?
-
19-09-2019 - |
문제
Eclipse 3.4에서 정밀하게 컴파일하고 실행하는 단위 테스트가 있지만 Javac을 사용하여 컴파일하려고하면 실패합니다. 코드를 작고 독립적 인 것으로 잘라내어 외부 종속성이 없습니다. 코드 자체는 컨텍스트를 벗어나지 않기 때문에 그다지 의미가 없지만 중요하지 않습니다. Javac이 왜 이것을 좋아하지 않는지 알아야합니다.
public class Test {
public void test() {
matchOn(someMatcher().with(anotherMatcher()));
}
void matchOn(SubMatcher matcher) {}
SubMatcher someMatcher() {
return new SubMatcher();
}
Matcher anotherMatcher() {
return null;
}
}
interface Matcher <U, T> {}
class BaseMatcher implements Matcher {
public BaseMatcher with(Matcher<?,?> matcher) {
return this;
}
}
class SubMatcher extends BaseMatcher {
@Override
public SubMatcher with(Matcher matcher) {
return this;
}
}
나는 함께 시도했다 JDK 1.5.0_10
그리고 1.6.0_13
, 동일한 결과로 :
Test.java:6: matchOn(test.SubMatcher) in test.Test cannot be applied to (test.BaseMatcher)
matchOn(someMatcher().with(anotherMatcher()));
^
1 error
나는 이것이 완벽하게 유효한 자바라고 생각합니다. submatcher.with () 메소드는 Basematcher.with ()보다 더 특정 유형을 반환하지만 컴파일러는 반환 유형이 Basematcher라고 생각하는 것 같습니다. 그러나 Eclipse 컴파일러가 잘못해서는 안되는 것을 허용 할 수 있습니다.
어떤 아이디어?
해결책
Basematcher에서는 유형 매개 변수를 지정해야합니다.
public SubMatcher with(Matcher<?, ?> matcher) {
Javac이 당신과 일치하도록 허용하기 위해 with
방법
추신
IMHO는 Eclipse 컴파일러의 버그입니다
다른 팁
추가하여 성공적으로 빌드했습니다 <?,?>
에게 Matcher
안에 SubMatcher.with
:
class SubMatcher extends BaseMatcher {
@Override
public SubMatcher with(Matcher<?,?> matcher) {
return this;
}
}
이것이 없으면 메소드 서명은베이스와 다릅니다. 나는 버그가 있는지 궁금합니다 @Override
이것을 알아 차리지 못하는 점검.
일식과 터미널에서 컴파일중인 JRE 또는 JDK를 확인하십시오. 어쩌면 버전 문제 일 수도 있습니다.
나를 위해 일 :
$ java -version openjdk version "1.7.0-internal" OpenJDK Runtime Environment (build 1.7.0-internal-****-2009_07_23_10_21-b00) OpenJDK 64-Bit Server VM (build 16.0-b06, mixed mode) $ javac -XDrawDiagnostics Test.java $
나는 그런 버그보고를 모호하게 기억하지만 지금 당신에게 그것에 대한 링크를 줄 수는 없습니다.