2013-02-23 7 views
3

이 코드 조각을 컴파일하기 위해 런타임에 문제가 발생합니다. java.lang.Integer 오류가 발생합니다. Java.lang.Double에 캐스트 할 수 없습니다. 나는 더 행복보다 더 사람은 컴파일러가 타입에 당신을 도울 수 없기 때문에 당신이 일반적인 HashMap를 사용하지 않아야합니다,이 코드를java.lang.ClassCastException : java.lang.Integer를 java.lang.Double에 캐스팅 할 수 없음

double x; 

public Double getMethod() { 

    HashMap hashmap= new HashMap(); 

    hashmap = SumCal(); 

    List listabc = (List) hashmap.get("abclist"); 
    int total=(Integer) hashmap.get("all_total"); 
    x = (Double) listabc.get(0)*100/total; 
    return x; 
    } 
+1

Integer를 Double로 변환 할 수 없기 때문입니다. 그들은 두 개의 다른 클래스이고 하나는 다른 클래스의 서브 클래스가 아닙니다. 대부분 listabc에서 신비하게 가져 오는 요소는 정수입니다. (암시 적 "복싱"전환에 의존하고 있기 때문에 자신을 혼란스럽게 만들고 혼란 스러울뿐입니다. 방금 배울 때 현명하지 않아야합니다.) –

+0

Java에서 클래스 계층 구조를보고 이와 같은 질문을하기 전에 확인하십시오. – ATrubka

+2

공평하게 C 기반 언어는 데이터 형식 변환과 참조 계층 조작과 같은 두 가지 본질적으로 관련이없는 개념에 대해 "캐스트"(용어와 표기법 모두)를 사용하여이 문제를 엄청나게 혼동합니다. "float"을 "int"로 변환하는 것은 "Number"를 "Integer"로 변환하는 것과 완전히 다른 개념입니다. (그리고 나는 교과서/참고서에서 논의 된이 혼란스러운 이분법을 보거나 교실에서 논의되는 것을 듣는 것을 본 적이 없다.) –

답변

4

당신은 다음과 같이 할 수있는,하지만 난 당신이 Generics 함께 갈 조언을 것입니다.

x = ((Integer) listabc.get(0) * 100/total); 

다음과 같은 Generics를 사용했다면 캐스팅이 필요하지 않습니다.

List<Integer> listabc 
HashMap<String, Integer> hashmap 
x = listabc.get(0) * 100/total; 

그런 경우에는 캐스팅이 필요하지 않습니다. Integer, Double etc 래퍼 클래스가 도입 된 이유 중 하나는 캐스팅을 피하는 것입니다.

0

먼저 해결하기 위해 나를 도와 준다면. 다음과 같은 선언하십시오 : 그냥 프로그래밍 오류를 초대로

HashMap<String, Integer> hashmap = new HashMap(); 

나는 다르게 값 유형의 HashMap를 저장하는 것을 권장하지 않습니다. 또한 intDouble으로 전송할 필요가 없습니다. 다음 중 하나를 수행 할 수 있습니다

x = listabc.get(0) * 100.0/total; // multiply by a floating-point number 

x = (double) listabc.get(0) * 100/total; // cast with (double) 
2

코드에 약간의 변화가 성공을 부여합니다 :

x = (double) listabc.get(0)*100/total; 

정수를 더블 호환 캐스팅되지 않지만, int로 더블 호환 확대된다. 현재 코드에서 표현식의 오른쪽 (RHS)이 정수까지 자동 조절되고 그 결과의 형 변환을 Double으로 지정합니다. 이 캐스팅은 실패합니다.

확대 변환을 지정하는 대신 Integer 결과는 int으로 박스가 풀린 다음 double으로 변환됩니다. 그리고 마지막으로이 라인 :

return x; 

Doublex의 값까지 박스와 방법의 결과로서 돌려줍니다.

관련 문제