Eclipse가 이것을 컴파일하는 이유는 있지만 Javac은 그렇지 않습니까?

StackOverflow https://stackoverflow.com/questions/1176799

  •  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 
$

나는 그런 버그보고를 모호하게 기억하지만 지금 당신에게 그것에 대한 링크를 줄 수는 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top