2012-04-10 4 views
2

다음 코드를 고려 2 웨이 :자바 매개 변수화 방법의 반환 값 유형은

(new MyClass()).<ExtType>foo(ExtType.class); 

흥미 롭다면, 메소드가 매개 변수화 된 것으로 선언 된 경우에도 Eclipse는 호출에 대해 경고를 발행하지 않습니다.

첫 번째 코드 조각에서 T 중 어느 것이 반환 값을 캐스팅하는 데 사용되는지 궁금합니다. 매개 변수는 T이고 반환 값은 T입니까? 왜 명시 적으로 반환 형식을 지정하지 않으면 ("1 방향"에서와 같이) 경고가 발행되지 않습니다?

답변

4

일반적으로 매개 변수 유형이 사용되지만 반환 유형이 정의 된 경우 (방법 2처럼) 컴파일러는이를 확인합니다.

T의 유형을 가져 오는 매개 변수가없는 경우 반환 유형 선언이 필요하며 이는 유형 유추라고합니다. 따라서 당신도 쓸 수 : 컴파일러 도움 (new MyClass()).<ExtType>foo(ExtType.class);과 같은 코드를 받고, 따라서 사용되는 유형을 지정해야 어떤 경우에는

public <T extends MyType> T foo() { 
    return (T)myField; 
} 


ExtType t = (new MyClass()).foo(); 

합니다. 그러나 서로 다른 유형을 정의하는 경우 (예 : (new MyClass()).<MyType>foo(ExtType.class);, 컴파일러는 어느 것이 사용되는지 알지 못하기 때문에 컴파일 타임 오류가 발생합니다.

+0

답변 해 주셔서 감사합니다. '(새로운 MyClass()) foo();'가 호출되면'foo()'안에 캐스트가 수행되지 않거나 더 정확하게'Object'에 캐스트 될 것인가? – dhblah

+0

@gasan 캐스트가 계속되지만 반환 된 값을 할당하는 변수의 유형에서 'T'유형이 유추됩니다. – Thomas

+0

@Tomas, 음, 실제로이 코드를 사용하여 검사했습니다 : public class GenericTest { static class MyType {} static class ExtType extends MyType {}; 정적 클래스 MyClass { MyType myField = new MyType(); public T foo() { return (T) myField; } } public static void main (String [] args) { ExtType t = (새 MyClass()). foo(); System.out.println (t); } }'ClassCastException은'foo()'결과를't'에 할당 할 때만 발생하고'foo()'실행 자체는 예외없이 실행됩니다. foo()에 캐스트가 없다는 뜻입니다. – dhblah

1

함수 선언에서 'T'를 정의하고 보유하고 반환하는 T 유형을 정의합니다. 당신의 경우, 당신은 매개 변수를 전달하고 동일한 반환 유형을 예상하고 ExtType을 확장하는 것으로 'T'를 선언했습니다. 따라서 eclipse는 경고를 생성하지 않습니다.