객체를 int로 캐스팅하는 방법


221

Java에서 Object를 int로 캐스팅하려면 어떻게해야합니까?


6
당신은 정말로 무엇을하고 싶습니까? 이 (이) Object가 아닌 경우 Integer캐스트에서 무엇을 기대하는지 잘 모르겠습니다.
unholysampler

2
먼저 instanceof keyword로 확인하십시오. 참이면 캐스팅하십시오.
Dead Programmer

앗 나는 열거 형 멤버가 특정 정수 값으로 캐스팅하여 winapi 상수에 대한 열거 형을 가질 수 있기를 원했습니다. msdn.microsoft.com/ko-kr/library/windows/desktop/…
Tomáš Zato-복원 Monica Monica

@ TomášZato 당신은 할 수 있습니다 (정렬) 정수 값을 보유하기 위해 열거 형에 필드를 정의 (예 :), 열거 형을 intValue생성하는 열거 형 생성자를 만들고 intValue열거 형 상수가 해당 생성자를 호출하고 getter를 추가 할 수 있습니다 에 대한 intValue. 그런 다음 전송하는 대신 getter를 호출하십시오.
Brian McCutchon

답변:


385

이 객체가 Integer:

int i = (Integer) object;

또는 Java 7부터 다음과 같이 작성할 수 있습니다.

int i = (int) object;

, 그것은을 던질 수 조심 ClassCastException개체가없는 경우 Integer와를 NullPointerException개체 인 경우null .

이렇게하면 Object가 Integer (wrap)라고 가정하고 int로 unbox합니다.

int는 프리미티브이므로로 저장할 수 없으며 Object유일한 방법은로 int간주 하여 상자에 Integer넣은 다음로 저장하는 것 Object입니다.


객체가 인 경우 메소드를 String사용하여 Integer.valueOf()간단한 int로 변환 할 수 있습니다 .

int i = Integer.valueOf((String) object);

NumberFormatException객체가 실제로 String정수로 내용 이 아닌 경우 를 던질 수 있습니다 .


자료 :

같은 주제에서 :


NullPointerException에 대해 확실합니까? 내가 널 개체 그냥 널 정수를 얻을 것이라고 생각 ....
에티엔 느 드 마르텔

7
NullPointerException의 언 박싱 동안 발생 Integerint
콜린 허버트

int로 캐스팅하지 않고 Object를 int로 캐스팅 할 수 없습니다. 실제로 Integer에 있고 int에 자동 상자를 사용합니다.
Steve Kuo

1
@Steve Kuo, Yep, 정확히 내가 말하는 것입니다. 그래서 "캐스트"단어를 사용하지 않았습니다.
Colin Hebert

@Etienne : null Object를 Integer로 캐스팅하여 null Integer를 얻을 수 있습니다. 그러나 int를 추출하려고하면 null 포인터 예외가 발생합니다. "null int"와 같은 것은 없습니다.
Jay

18

객체가 Integer 다음을 수행 할 수 있습니다.

int i = ((정수) obj) .intValue ();

객체가 객체가 아닌 경우 Integer유형을 감지하고 유형에 따라 변환해야합니다.


obj가 null 인 경우 NullPointerException이 발생합니다.
Colin Hebert

Integer 객체가 아닌 경우 ClassCastException
Erick Robertson

1
intValue오토 박싱을 호출 할 필요가 없습니다 .
OscarRyz

1
intValueint와의 상호 교환이 가능하다는 초보자 혼란을 고려할 때 특히 명확 Integer합니다.
Steve Kuo

14

시나리오 1 : 간단한 사례

객체가 인 것을 보장하는 경우 Integer간단한 방법입니다.

int x = (Integer)yourObject;

시나리오 2 : 숫자 개체

자바에서는 Integer, Long, BigInteger등 모든 구현 Number라는 이름의 메소드가 인터페이스를 intValue. 수치 측면이있는 다른 모든 사용자 정의 유형도 구현해야합니다 Number(예 :) Age implements Number. 그래서 당신은 할 수 있습니다 :

int x = ((Number)yourObject).intValue();

시나리오 3 : 숫자 텍스트 구문 분석

명령 행 (또는 텍스트 필드 등)에서 사용자 입력을 받으면이 값을로받습니다 String. 이 경우 다음을 사용할 수 있습니다 Integer.parseInt(String string).

String input = someBuffer.readLine();
int x = Integer.parseInt(input);

로 입력을 받으면을 Object사용 (String)input하거나 다른 텍스트 유형을 가질 수있는 경우 input.toString():

int x = Integer.parseInt(input.toString());

시나리오 4 : ID 해시

Java에는 포인터가 없습니다. 그러나 Object에 대한 포인터와 같은 기본 구현 hashCode()이 있으며를 통해 직접 사용할 수 있습니다 System.identityHashCode(Object o). 그래서 당신은 할 수 있습니다 :

int x = System.identityHashCode(yourObject);

이것은 실제 포인터 값 이 아닙니다 . ID 해시가 유지되는 동안 JVM이 객체의 메모리 주소를 변경할 수 있습니다. 또한 두 개의 살아있는 객체는 동일한 ID 해시를 가질 수 있습니다.

을 사용할 수도 object.hashCode()있지만 유형별로 다를 수 있습니다.

시나리오 5 : 고유 색인

같은 경우 데이터베이스 테이블의 ID 값을 자동 증분하는 것과 같이 고유하지 않은 ID 해시와는 달리 각 개체마다 고유 한 인덱스가 필요합니다. 이를위한 간단한 샘플 구현 :

class ObjectIndexer {

    private int index = 0;

    private Map<Object, Integer> map = new WeakHashMap<>();

    public int indexFor(Object object) {
        if (map.containsKey(object)) {
            return map.get(object);
        } else {
            index++;
            map.put(object, index);
            return index;
        }
    }

}

용법:

ObjectIndexer indexer = new ObjectIndexer();
int x = indexer.indexFor(yourObject);    // 1
int y = indexer.indexFor(new Object());  // 2
int z = indexer.indexFor(yourObject);    // 1

시나리오 6 : 열거 형 멤버

Java 열거 형 멤버는 정수가 아니라 완전한 기능을 갖춘 객체입니다 (예 : C / C ++과 달리). 아마도 enum 객체를로 변환 할 필요는 int없지만 Java는 색인 번호를 각 enum 멤버에 자동으로 연결합니다. 이 색인은 Enum.ordinal()예를 들어 다음을 통해 액세스 할 수 있습니다 .

enum Foo { BAR, BAZ, QUX }

// ...

Object baz = Foo.BAZ;
int index = ((Enum)baz).ordinal(); // 1

여기에 이미지 설명을 입력하십시오


13
@Deprecated
public static int toInt(Object obj)
{
    if (obj instanceof String)
    {
         return Integer.parseInt((String) obj);
    } else if (obj instanceof Number)
    {
         return ((Number) obj).intValue();
    } else
    {
         String toString = obj.toString();
         if (toString.matches("-?\d+"))
         {
              return Integer.parseInt(toString);
         }
         throw new IllegalArgumentException("This Object doesn't represent an int");
    }
}

보시다시피, 이것은 매우 효율적인 방법은 아닙니다. 당신은 단순히 당신이 어떤 종류의 물건을 가지고 있는지 확인해야합니다. 그런 다음 올바른 방법으로 int로 변환하십시오.


@Deprecated (e 대신 a)가 아닙니까? :) 좋은 방법이지만 객체 유형에 대한 가정은 없습니다.
extraneon

그건 그렇고, 정규 표현식은 기수 16 진수를 고려하거나 10 진수를 고려하지 않습니다. ToInt는 현명한 방법입니다. NumberFormatExcepytion을 시도하고 잡는 것이 좋습니다.
extraneon

4

Integer (int의 래퍼 클래스)로 캐스팅해야합니다. 그런 다음 Integer의 intValue () 메서드를 사용하여 내부 int를 얻을 수 있습니다.


4

대답:

int i = ( Integer ) yourObject;

개체가 이미 정수인 경우 원활하게 실행됩니다. 즉 :

Object yourObject = 1;
//  cast here

또는

Object yourObject = new Integer(1);
//  cast here

기타

객체가 다른 것이라면, 가능한 경우 먼저 객체를 int로 변환해야합니다.

String s = "1";
Object yourObject = Integer.parseInt(s);
//  cast here

또는

String s = "1";
Object yourObject = Integer.valueOf( s );
//  cast here

4

GSON에서 데이터를 처리 할 때 하나의 라이너를 사용합니다.

int i = object != null ? Double.valueOf(object.toString()).intValue() : 0;

긴 과정입니다. Double.valueOf (object.toString ()). intValue () 대신 (int) Object 를 수행하십시오 . 이것은 숫자에 대해서만 작동합니다.
Sudhakar Krishnan

1
@SudhakarK : (int) 객체가 정수인 경우에만 객체가 작동합니다. 이 oneliner는 문자열 번호도 지원합니다. EG "332".
Jacob van Lingen

2

이 경우 Object원래로 인스턴스화 한 Integer다음, 당신은이에 다운 캐스트 할 수 int캐스트 연산자를 사용하여 (Subtype).

Object object = new Integer(10);
int i = (Integer) object;

주 당신이 적어도 자바 1.5을 사용하는 경우에만 작동하는 기능을 오토 박싱 그렇지 않으면 선언해야, i같은 Integer대신 다음 전화 intValue()그것을 .

그러나 처음에 전혀 생성 Integer되지 않았다면 그렇게 다운 캐스트 할 수 없습니다. 그것은 초래 ClassCastException메시지의 원래 클래스 명으로. 객체의 경우 toString()표현에 의해 얻은 String#valueOf()나타냅니다 구문 적으로 유효한 정수 번호 (앞에 마이너스 기호와 필요에 따라 예를 들어 숫자 만), 당신은 사용할 수 있습니다 Integer#valueOf()또는 new Integer()이합니다.

Object object = "10";
int i = Integer.valueOf(String.valueOf(object));

또한보십시오:


2
int i = (Integer) object; //Type is Integer.

int i = Integer.parseInt((String)object); //Type is String.

2

할 수 없습니다. 는 int이 원시 형의 객체가 아닙니다. Integer로 캐스팅 한 다음 int를 가져올 수 있습니다.

 Integer i = (Integer) o; // throws ClassCastException if o.getClass() != Integer.class

 int num = i; //Java 1.5 or higher

이것은 객체가 거의 확실하지 않은 정수라고 가정합니다. 아마도 현행 솔루션 ala Coronauts
Bill K

객체를 객체로 캐스팅 한 다음 정수 변수로 설정하려고 할 때 어떻게 컴파일 할 수 있습니까?
Carlos

2

당신은 할 수 없습니다. 는 int입니다 Object.

Integer입니다 Object하지만,하지만 나는 당신이 무슨 뜻인지 의심.


Java 5부터 자동 권투 / 박스 해제가 있습니다.
Bruno

@Bruno : Object를 int로 캐스팅 할 수 없습니다. Object를 Integer로 캐스트 한 다음 int에 할당하면 마술처럼 자동 언 박스됩니다. 그러나 Object를 int로 캐스팅 할 수는 없습니다.
Jay

(계속) 개인적으로 사람들은 오토 박싱에 의존하는 많은 나쁜 코드를 만듭니다. 같은 날, "Double amount = (Double.parseDouble (stringAmount)). doubleValue ();"라는 성명서를 보았습니다. 즉, String을 구문 분석하여 이중 프리미티브를 얻은 다음 이것에 대해 함수를 실행하여 컴파일러가이를 Double 객체로 자동 상자 화하도록했지만이 함수는 doubleValue로 더블 프리미티브를 추출하여 Double에 할당했습니다. 오토 박스를 강제하는 객체. 즉, 그는 프리미티브에서 객체로, 프리미티브에서 객체로, 3 회의 변환으로 변환했습니다.
Jay

@Jay, 첫 번째 의견에 동의했습니다 (죄송합니다. 너무 많은 변환에 관해서는 그렇습니다. 그러나 JIT 컴파일러가 그에 잘 대처할 수 있다는 인상을 얻습니다. 실제로 그렇게 중요하지는 않습니다 (실제로 나쁜 코드에 대한 변명은 아닙니다) ...)
Bruno

1
@Bruno 예기치 않은 NullPointerExceptions을 줄 수있는 오토 박싱의 까다로운 부분입니다.
extraneon

1

String을 int로 캐스팅하려는 경우을 사용하십시오 Integer.valueOf("123").

대부분의 다른 객체는 int 값을 가지지 않기 때문에 int로 캐스팅 할 수 없습니다. 예를 들어 XmlDocument에는 int 값이 없습니다.


1
valueOf 메소드로 인해 불필요한 언 박싱이 발생 Integer.valueOf("123")하기 Integer.parseInt("123")때문에 필요한 것이 프리미티브 인 경우 사용하지 마십시오 .
Kerem Baydoğan

1

C 또는 C ++을 사용하여 숫자와 같은 객체 포인터를 조작 할 수있는 이유가 궁금하지만 Java에서 동일한 방식으로 객체 참조를 조작 할 수는 없습니다.

Java의 객체 참조는 C 또는 C ++의 포인터 와 다릅니다. 포인터는 기본적 으로 정수이며 다른 int처럼 조작 할 수 있습니다. 참조는 의도적으로보다 구체적인 추상화이며 포인터가 할 수있는 방식으로 조작 할 수 없습니다.


1
int[] getAdminIDList(String tableName, String attributeName, int value) throws SQLException {
    ArrayList list = null;
    Statement statement = conn.createStatement();
    ResultSet result = statement.executeQuery("SELECT admin_id FROM " + tableName + " WHERE " + attributeName + "='" + value + "'");
    while (result.next()) {
        list.add(result.getInt(1));
    }
    statement.close();
    int id[] = new int[list.size()];
    for (int i = 0; i < id.length; i++) {
        try {
            id[i] = ((Integer) list.get(i)).intValue();
        } catch(NullPointerException ne) {
        } catch(ClassCastException ch) {}
    }
    return id;
}
// enter code here

이 코드는 왜 ArrayList중요한지, 왜 사용 하는지를 보여줍니다 . int에서 캐스팅하기 만하면 됩니다 Object. 도움이 될 수 있습니다.


답을 알려주십시오
Gwenc37

1

예를 들어 객체 변수; hastaId

Object hastaId = session.getAttribute("hastaID");

예를 들어 객체를 int로 캐스트,hastaID

int hastaID=Integer.parseInt(String.valueOf(hastaId));

0

이 코드를 참조하십시오 :

public class sample 
{
  public static void main(String[] args) 
  {
    Object obj=new Object();
    int a=10,b=0;
    obj=a;
    b=(int)obj;

    System.out.println("Object="+obj+"\nB="+b);
  }
}

0
so divide1=me.getValue()/2;

int divide1 = (Integer) me.getValue()/2;

이것은 캐스팅이 필요한 상황을 보여 주며 실제로이 상황과 함께 나타나는 오류를 추가 할 것입니다. 새 코더가 예제가 없으면 실제 구현을 파악하기가 어렵습니다. 이 예가 도움이 되길 바랍니다
Nehal Pawar

0

마지막으로 사양에 가장 적합한 구현이 발견되었습니다.

public int tellMyNumber(Object any) {
    return 42;
}

-4

먼저 instanceof keyword로 확인하십시오. 참이면 캐스팅하십시오.


나는 이것을 사용했고 이제 그 줄에서 'Boxed value is unboxed and immeditaley reboxed'를 해결하는 방법을 궁금해하고 있습니다. (스팟 버그 검사로 인해) 이제 더 잘 해결하는 방법이 궁금합니다.
재스퍼 Lankhorst
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.