2011-04-06 9 views
31
ArrayList marks = new ArrayList(); 
Double sum = 0.0; 
sum = ((Double)marks.get(i)); 

매번 두 배로, 나는 상태 ClassCastException를 얻을 실제로 ArrayList 어떤 정수를 추가 포함되지 않습니다 표시했습니다 -하지만 당신은을 경우에 당신이있어 정수를했습니다 것을 알고, 당신은 사용할 수 있습니다는 ClassCastException, 캐스팅 정수 내 프로그램을 실행하려고

sum = (double) ((Integer) marks.get(i)).intValue(); 

int로 변환됩니다 즉, 이는 다음 수 double로 변환하십시오. 박스형 클래스간에 직접 변환 할 수는 없습니다.

ArrayList에 제네릭을 사용할 수있는 경우 코드가 명확 해집니다.

답변

25

코드 당신 'java.lang.Double에

으로 캐스팅 할 수 없습니다
+1

당신이 사용하는 경우는'Integer.doubleValue()는'double''에'int' 캐스팅 할 필요가 없습니다. 'sum = ((Integer) marks.get (i)). doubleValue();'는보다 간결합니다. –

5

는 마크를 지정

List<Double> marks = new ArrayList<Double>(); 

이라고 제네릭을.

+0

ArrayList가 Doubles로 가득 찬 경우 그는 ClassCastException을 얻지 못합니다. 배열은 정수로 가득해야합니다. 맞습니까? – Gray

+2

@ 그레이 - 하나의 '정수'로 충분하다.) –

42

우리는 doubleint 캐스팅 할 수 있지만 우리는 래퍼 클래스 IntegerDouble와 동일한 작업을 수행 할 수 없습니다

int  a = 1; 
Integer b = 1; // inboxing, requires Java 1.5+ 

double c = (double) a; // OK 
Double d = (Double) b; // No way. 

이것은 런타임 예외에 해당하는 컴파일 타임 오류를 보여줍니다.

+1

흠 .. 오래된 질문이다. Java 7을 사용하면 Integer를 * double *로 캐스팅 할 수 있으며, 예상했던대로 마술이 발생합니다 :'Double km = (double * (meters * 1_000);) – will

0

즉, ArrayList에는 일부 요소에 정수가 있습니다. 요소 중 하나에 정수가 없으면 캐스팅이 작동해야합니다.

arraylist에 정수가 없는지 확인하는 한 가지 방법은 Doubles 배열로 선언하는 것입니다. 이중

int abc=12; //setting up integer "abc" 

System.out.println((double)abc); 

하는 코드를 정수 변경

ArrayList<Double> marks = new ArrayList<Double>(); 
3

것는 "12.0"으로 표시된다는 것을 의미 출력 정수 배와 같은 "ABC"는. 이 정밀 숫자가 저장되었음을 나타내는 소수점 자리가 있음을 주목하십시오. 당신이 다시 변경하려면 이중와 같은

,

double number=13.94; 

System.out.println((int)number); 

이 코드는 정수로 한 줄, "수"에 인쇄됩니다. 출력은 "13"이됩니다. 값은 반올림되지 않았으며 데이터는 실제로 생략되었습니다.

8

질문에 게시 된 코드는 분명히 완전한 예가 아닙니다. arraylist에는 아무 것도 추가하지 않고 어디에도 i을 정의하지 않았습니다.

처음에는 다른 사람들은 원시 유형과 상자 유형의 차이점을 이해해야한다고 말했습니다. 예 : Integer 상자 int, Double 상자 double, Long 상자 long 등입니다. Java는 다양한 시나리오에서 상자와 박스를 자동으로 닫습니다 (예전에는 라이브러리 호출을 사용하여 수동으로 상자에 넣고 상자에 넣지 않아도되지만 PITA는 못 생겼습니다).

http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html

는 당신은 대부분 다른 하나 개의 원시적 형태에서 캐스트 할 수 있습니다 (예외가 boolean 인)하지만 당신은 박스 유형에 대해 동일한 작업을 수행 할 수 없습니다. 하나의 박스형을 다른 것으로 변환하는 것은 좀 더 복잡합니다. 특히 상자 유형을 미리 모르는 경우. 일반적으로 하나 이상의 기본 유형을 통해 변환이 필요합니다.

귀하의 질문에 대한 답변은 귀하가 할 수있는 유형의 개체 인 경우 arraylist에 무엇이 있는지에 따라 달라집니다. 장면이 처음 Integermarks.get의 결과를 캐스팅 뒤에 int

sum = ((double)(int)marks.get(i)); 

캐스트 은, 그것은 그 정수를 언 박싱 할 것입니다. 그런 다음 다른 캐스트를 사용하여 프리미티브 int을 프리미티브 double으로 변환합니다. 마지막으로 결과는 sum 변수에 할당 될 때 Double으로 다시 자동 저장됩니다. (대부분의 경우 Double이 아닌 합계가 double 일 확률이 높습니다).

arraylist에 유형이 혼합되어 있지만 모두 Number 인터페이스 (Integer, Short, Long, Float 및 Double가 모두 가능하지만 Character 및 Boolean은 그렇지 않음)를 구현하는 경우 수행 할 수 있습니다. 믹스의 다른 유형이있는 경우

sum = ((Number)marks.get(i)).doubleValue(); 

너무 당신은 그들을 식별하고 적절한 조치를 취하도록 instanceof 연산자를 사용하는 것을 고려해야 할 수도 있습니다.

1
sum = Double.parseDouble(""+marks.get(i)); 
+1

코드 스 니펫이 OP에 대답하는 이유와 방법에 대한 설명 추가를 고려해보십시오. 문제. –

+3

marks.get (i)가 null 인 경우 오류가 발생합니다. –

0

주된 문제는 래퍼 클래스를 사용하여 형 변환한다는 것입니다. 호환되지 않는 형식 인 것으로 보입니다.

하지만 또 다른 문제는 "i"가 int이므로 최종 결과를 캐스팅하고 i도 캐스팅해야한다는 것입니다. 또한 "double"래퍼 클래스가 아닌 캐스트 할 때 "double"키워드를 사용해보십시오.

여기에서 확인할 수 있습니다 :이 도움이

희망을. 스레드가 유용하다는 것을 알았지 만 이것이이를 명확히하는 데 도움이된다고 생각합니다. 여기 이해하기

3

2 일 -

1) 원시 double에 원시 interger를 캐스팅하는 경우. 그것은 작동합니다. 예 : 잘 작동합니다.

int pri=12; System.out.println((double)pri);

2) Double 객체 또는 그에 Integer 개체를 캐스팅하려고하면 - 반대로, 그것은 실패합니다.

Integer a = 1; Double b = (double) a; // WRONG. Fails with class cast excptn 

솔루션

-

Soln 1) Integer i = 1; Double b = new Double(i); 
soln 2) Double d = 2.0; Integer x = d.intValue(); 
관련 문제