2011-01-04 5 views
4

다음 테스트에서 TesterClass는 두 개의 형식 매개 변수 사이의 관계에 제약 조건을 배치합니다. func2() 메서드는 해당 제약 조건을 벗어나는 것처럼 보입니다. func2의 정의에 따라 또는 클래스가 String 이외의 두 번째 매개 변수와 함께 사용될 때마다 입력 컴파일 오류가 발생할 것으로 예상되지만 그렇지 않습니다.왜 컴파일됩니까? 코드가 형식 매개 변수에 대한 제한 조건을 위반하는 것 같습니다

또한 func2를 호출하고 결과를 적절히 유형이 지정된 변수에 저장하면 해당 변수의 유형에 따라 컴파일이 실패합니다. 그러나 함수의 반환 형식이 두 경우 (위쪽 캐스트 전)에 동일한 형식을 가져야 함에도 불구하고 동일하게 수행하고보다 일반적인 형식 (예 : Object)으로 저장하는 것은 성공합니다.

여기 무슨 일 이니?

감사합니다.

public class TestGenerics { 
    public static class ParamedType<T> {} 


    public class TesterClass<A extends ParamedType<B>, B> { 
     public TesterClass<A, B> func() { 
      return new TesterClass<A, B>(); 
     } 

     public TesterClass<A, String> func2() { 
      return new TesterClass<A, String>(); 
     } 
    } 

    public Object test() { 
     // How can I use these type parameters? Doesn't .func2 now have an invalid return type? 
     TesterClass<ParamedType<Integer>,Integer> testClass = new TesterClass<TestGenerics.ParamedType<Integer>, Integer>(); 

     //TesterClass<ParamedType<String>, Integer> res2 = testClass.func2(); // <-- will not compile 
     Object res = testClass.func2(); // Compiles 
     return res; 
    } 
} 

편집 :이 은 javac의 컴파일하지 않습니다 (버전은 아래에보고 됨). Eclipse를 사용하고 실제로 실행중인 컴파일러가 무엇인지 알아 내려고합니다. 업데이트됩니다. JDT (Eclipse 컴파일러) 버그 일 수 있습니다.

나는 일식의 JDT에 대한 버그 리포트를 열었습니다

: https://bugs.eclipse.org/bugs/show_bug.cgi?id=333503

+1

javac 1.6.0_21 나를 컴파일하지 않습니다. – axtavt

+0

Java 6.0 준수 수준의 Eclipse 컴파일러에서 컴파일 –

+0

코드 끝에 누락 된 중괄호가 있지만 컴파일되지 않습니다 (JDK 1.6.0_20의 javac를 통해). – kvista

답변

6

간단한 대답 : 당신은 무엇을 말하지 않았다

Test.java:10: type parameter A is not within its bound 
    public TesterClass<A, String> func2() { 
        ^
    where A,B are type-variables: 
    A extends ParamedType<B> declared in class Test.TesterClass 
    B extends Object declared in class Test.TesterClass 
Test.java:11: type parameter A is not within its bound 
     return new TesterClass<A, String>(); 
          ^
    where A,B are type-variables: 
    A extends ParamedType<B> declared in class Test.TesterClass 
    B extends Object declared in class Test.TesterClass 
2 errors 

: 적어도 javac의 1.7에서, 컴파일되지 않습니다 그것을 아래에 컴파일했다 - 제 생각 엔 귀하의 Java 컴파일러에 버그가있다.

+1

방금 ​​javac 1.6으로 테스트했습니다.0_23 실제로 컴파일되지 않습니다. – sinelaw

+0

그런데 Eclipse에서이 문제를보고 한 지 2 년이 지났지 만 아직 해결되지 않았습니다. 하나는 유형 안전을 강요하는 것이 Java 컴파일러의 임계 수준에서 높은 순위를 차지할 것이라고 생각합니다. – sinelaw

관련 문제