2017-11-29 19 views
2

가정하자 나는 방법 numberClassCastException

Float f = getNumber(); 

결과와 같은 메소드를 호출, Integer의 인스턴스 가정

@SuppressWarnings("unchecked") 
public <T extends Number> T getNumber() { 
    try { 
     return (T)number; 
    } catch (ClassCastException e) { 
     return null; 
    } 
} 

에게 있습니다.

지우기 유형이인데 (예외적으로) 알고 있지만 예외가 할당 수준까지 올라가고 메소드 내부에서 catchable이 아닌 이유에 대해 더 깊은 설명을 할 수 있습니까?

참고 : 내가 classT의 유형을 확인 버전 public <T extends Number> T getNumber(Class<T> classT)을 할 수 있지만, classT을 통과 없애 기대되고 위의 문제를 생각해 중단했다. (numberInteger 인스턴스이기 때문에) 예외가 발생하지 않는다 (이 NumberT의 결합 된 형태이기 때문에)

답변

4

타입 소거 후에는 return (T)numberreturn (Number)number된다. 한편

, 할당

Float f = getNumber(); 

은 캐스트없이 Float 변수에 할당 할 수 없습니다 getNumber() 리턴한다 Number, 이후

Float f = (Float) getNumber(); 

로 컴파일됩니다.

getNumber()Float이 아닌 경우이 캐스팅은 ClassCastException을 던집니다.

4.6. Type Erasure

유형의 삭제는 (결코 매개 변수 유형 없거나 변수를 입력) 유형의 종류 (아마도 매개 변수 유형을 포함하고 변수를 입력)에서의 매핑입니다. 우리는 | T | 소거 매핑은 다음과 같이 정의된다 ...

타입 변수 (§4.4)의 삭제는 가장 왼쪽 경계의 삭제이다.

+0

명확하고 이해할 수있는 답변 (어떻게 빨리 작성하고 명확하게 작성할 수 있습니까?). 나는'extends Number'를 삭제 했으므로''만이'return (Object) number'가 될 것이라고 생각합니까? – pirho

+0

@pirho 틀 렸습니다. – Eran