2016-08-18 2 views
4

내가 추론 입력 JDK8 감사에서 잘 컴파일 다음 코드를 실행하려고 해요 : CB가 [Ljava.lang 캐스트 할 수없는 :이 ClassCastException이 발생합니다 실행, 그러나JDK8 타입 추론 문제

public static <A,B> B convert(A a) { 
    return (B) new CB(); 
} 
public static void main(String[] args) { 
    CA a = new CA(); 
    CB b = convert(a); //this runs fine 
    List<CB> bl = Arrays.asList(b); //this also runs fine 
    List<CB> bl1 = Arrays.asList(convert(a)); //ClassCastException here 
} 

을 .Object,하지만 CB b = convert (a) 잘 작동합니다.

왜 그런가?

+3

잠깐, 무엇이 변환하는 중입니까? 인수가 무시되므로 전달되는 내용은 중요하지 않습니다. – Carcigenicate

+1

어떤 JRE 버전을 사용합니까? 나는 1.8.0_92의'java.lang.VerifyError : 잘못된 타입의 피연산자 스택'을 얻는다. Btw, 타입 증인을 사용하여 나를 위해 작동합니다 :'List bl1 = Arrays.asList (Test. convert (a));' –

+1

@StefanZobel 실제로 작동하지만 약 150 사용법을 수동으로 변경하는 것은 쉽지 않습니다 - JDK8이 자동으로 추론을하기를 바랬다 –

답변

3

발신자가 원하는 것을 반환하겠다고 약속 한 서명으로 일반 메소드를 만들 때마다 문제가 있는지 묻습니다. 컴파일러에서 기본적으로 의미하는 "확인되지 않은"경고가 표시되어야합니다. 예기치 않은 ClassCastException이 발생할 수 있습니다. 그와 호환되는 가변 인자 포장 (요구하지 않는 메소드 호출을 선호하기 때문에

당신은, 컴파일러가 실제로 내가 아는 한

List<CB> bl1 = Arrays.asList(YourClass.<CA,CB[]>convert(a)); 

을 추정 반면, 컴파일러는

List<CB> bl1 = Arrays.asList(YourClass.<CA,CB>convert(a)); 

을 추론 할 것으로 예상 사전 varargs 코드).

convert 메서드가 예상 된 배열 형식을 반환하지 않으므로 실패합니다.