2011-05-12 3 views
13

이것이 작동하는 이유 :자바, 불가능한 캐스트 객체 ..... 왜?

 Object prova = 9.2; 
System.out.println(prova); 
Double prova2 = (Double) prova; 
System.out.println(prova2); 

그리고 이것은 아닙니까?

Object prova = 9.2; 
System.out.println(prova); 
Float prova2 = (Float) prova; 
System.out.println(prova2); 

나는이 일을 내 Java 안드로이드 응용 프로그램에서 1 시간을 잃어 버렸습니다. 그래서 나는 그것을 double 형으로 캐스팅해야했고 double 형은 float 형이거나 예외가있었습니다.

+1

당신이 후자에서 예외 텍스트를 읽을 경우하지 플로트 간단한 플로트로 전송 해 봅니다해야하는 I 'ClassCastException'이라고 가정), Float과 Double의 상속 계층 구조를 살펴보면 답은 분명합니다. – Anon

답변

16

당신이

Object prova = 9.2; 

를 쓸 때 당신은 오토 박싱에 의존하고 있기 때문에 Float으로 바꾸려면

Object prova = 9.2f; 

java.lang.Float 및 java.lang.Double은 형제 유형입니다. 당신이 어떤 형식으로 숫자를 표현 API를 사용하고자하는 경우에는 지정하지 않은 경우, 그것은 이중 될 것입니다 때문에 일반적인 유형은 예를 Number.floatValue()

8

했다 DoubleFloat의 하위 유형이 아닙니다. 당신은이 같은 수 9.2f (있는 경우 prova 실제로 Float 것) 또는 :

어느 쪽이든 당신은 리터럴 플로트와 함께 시작할 수

Float prova2 = ((Double) prova).floatValue(); 
+0

Float이 Double의 부속 유형이라면 캐스트가 어쨌든 작동하지 않았을 수도 있습니다. – jarnbjo

+0

맞아요, 잘못된 순서로 가져 왔습니다. 더 나은 지금? – aioobe

14

9.2 이중 문자입니다. 대신 9.2f을 시도하십시오.

Object prova = 9.2f; // float literal is auto-boxed to a Float 
System.out.println(prova); 
Float prova2 = (Float) prova; // Float can be cast to Float, while Double cannot 
System.out.println(prova2); 

(당신은 아마 당신의 질문에 포함해야) 오류 메시지가 아주 잘 또한 설명 :

Exception in thread "main" java.lang.ClassCastException: 
    java.lang.Double cannot be cast to java.lang.Float 
+0

'System.out.println (prova.getClass());'를 추가하면 어떤 일이 일어나는지 확인할 수 있습니다. – leonbloy

2

를 들어, 상위를

입니다. 당신이 float를하길 원한다면, 당신은

Object prova = 9.2F; 
System.out.println(prova); 
Float prova2 = (Float) prova; 
System.out.println(prova2); 
0

은 (