정수를 Long으로 변환


108

반사를 사용하여 필드의 값을 얻어야합니다. 필드의 데이터 유형이 무엇인지 항상 확신하지 못하는 경우가 발생합니다. 이를 위해 일부 코드 중복을 피하기 위해 다음 방법을 만들었습니다.

@SuppressWarnings("unchecked")
private static <T> T getValueByReflection(VarInfo var, Class<?> classUnderTest, Object runtimeInstance) throws Throwable {
  Field f = classUnderTest.getDeclaredField(processFieldName(var));
  f.setAccessible(true);
  T value = (T) f.get(runtimeInstance);

  return value;
}

이 방법을 다음과 같이 사용하십시오.

Long value1 = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);

또는

Double[] value2 = getValueByReflection(inv.var2(), classUnderTest, runtimeInstance);

문제는 내가 캐스트에 보이지 않을 수 있다는 것입니다 IntegerLong:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long

이것을 달성하는 더 좋은 방법이 있습니까?

Java 1.6을 사용하고 있습니다.

답변:


91

아니요, 에서 로 변환 할 수는 있지만 Integer로 전송할 수 없습니다 . 를 들어 개별 알려져있다 값이 숫자를 수하고 긴 값을 얻으려면, 당신은 사용할 수 있습니다 :Longintlong

Number tmp = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);
Long value1 = tmp.longValue();

배열의 경우 더 까다로울 것입니다 ...


배열의 Number[]경우 적절한 형식의 배열을 만들기 위해 그 위에 및 루프를 사용할 수 있습니다 .
Tiago Veloso 2011

@Tiago : 메서드가 실제로 반환 하는 내용에 따라 다릅니다 . 그건 작동하지 않을 것입니다 double[]예를 들어,하지만 것이다 A에 대한 작업 Double[].
Jon Skeet

7
Integer에서 Long으로 캐스팅 할 수없는 이유는 무엇입니까?
MrMas

@MrMas : 별도의 참조 유형이기 때문에 Number. 당신이 믿는다 변환 규칙 : 아니면 다른 방법 넣어 않습니다 당신이 다른 하나를 변환 할 수 있습니까?
존 소총

6
확인. 문제는 상속입니다. 나는 정밀도의 관점에서 생각하고 있습니다. 정보 손실없이 정수를 긴 정수로 변환 할 수 있습니다. 그러나 상속 구조에는 컴파일러에게 알려주는 정보가 없습니다.
MrMas

134

간단히:

Integer i = 7;
Long l = new Long(i);

10
정수가 null의 경우 NPE가 발생합니다
럭스가

2
int가치를 위해 작동 합니다.
dARKpRINCE

11

이 코드는 작동합니다 (Java 는 현재 사용되지 않는 생성자에 전달하기 전에 Integerto를 묵시적으로 언 박싱 한 int다음 캐스트합니다 .longLong(long)
Ole VV

53
Integer i = 5; //example

Long l = Long.valueOf(i.longValue());

이렇게하면 문자열로 변환하는 성능 저하를 방지 할 수 있습니다. longValue()Integer 의 메서드는 int 값의 캐스트입니다. 이 Long.valueOf()메서드는 vm에게 캐시 된 값을 사용할 수있는 기회를 제공합니다.


2
널 저장하려면 : Long l = i == null? null : i.longValue ()
Adrodoc55

19

이상하게도 문자열에서 구문 분석하면 작동한다는 것을 알았습니다.

 int i = 0;
 Long l = Long.parseLong(String.valueOf(i));
 int back = Integer.parseInt(String.valueOf(l));

승리.


1
나에게는 전혀 의미가 없지만 매력처럼 작동합니다. 감사합니다!
Bouncner

33
이유없이 문자열 변환을 도입하는 것은 정말 나쁜 생각입니다.
Jon Skeet 2013 년

6
@JonSkeet에 동의하고 다음과 같이하는 것이 좋습니다 .Object i = 10; Long l = ((Number) i) .longValue ();
depsypher

1
이 방법은 잘 작동하지만 상대적으로 느리고 다른 방법보다 더 많은 메모리를 사용합니다.
krispy

1
프론트 엔드 개발자 관점에서 보면
멋지다

8

정수를 Long으로 변환하기 매우 간단하고 여러 가지 방법으로
예제 1

 new Long(your_integer);

예 2

Long.valueOf(your_integer); 

예제 3

Long a = 12345L;

예제 4
Integer로 입력 된 int가 이미있는 경우 다음을 수행 할 수 있습니다.

Integer y = 12;
long x = y.longValue();

7

Integer 끝에 'L'을 추가하여 정수를 long으로 직접 변환합니다.

Long i = 1234L;

5
나는 당신이 전체 질문을 읽지 않고 대답했다고 확신합니다!
Diablo

3
구글의 "롱 INT"를 검색 할 때이 질문은 첫 번째 결과이다 @Diablo,이 답변이 다른 사람에게 유용 할 수 있습니다
디미트리 W

1
@DimitriW이 대답이 틀렸다고 말하는 것은 아니지만이 질문에 대한 대답이 틀렸다고 말하고 있습니다. 당신이 옳습니다, 이것은 질문을 읽지 않고 답만 보는 사람들에게 유용합니다.
Diablo

7

Integer가 null이 아닌 경우

Integer i;
Long long = Long.valueOf(i);

i자동으로 long.

valueOf대신 사용 new하면 컴파일러 또는 JVM에 의해이 값 (작은 경우)을 캐싱 할 수 있으므로 코드가 더 빨라집니다.


Long.valueOf (Integer i) 메서드를 찾을 수 없습니다. 내가 찾은 유일한 방법은 valueOf (long l), valueOf (String s) 및 valueOf (String s, int radix)입니다. Java8 및 Java9 문서를 확인했습니다.
Andy

1
정수는 암시 적으로 원시 long 유형으로 변환됩니다.
lostintranslation


2

Integer가 NULL이 아니라는 것을 알고 있다면 다음과 같이 간단하게 수행 할 수 있습니다.

Integer intVal = 1;
Long longVal = (long) (int) intVal


1

int변수에서 long유형으로 의 파서 가 Integer클래스에 포함됩니다 . 다음은 예입니다.

int n=10;
long n_long=Integer.toUnsignedLong(n);

이 내장 함수를 사용하여에서 int로 구문 분석하는 메서드를 쉽게 만들 수 있습니다 long.

    public static long toLong(int i){
    long l;
    if (i<0){
        l=-Integer.toUnsignedLong(Math.abs(i));
    }
    else{
        l=Integer.toUnsignedLong(i);
    }
    return l;
}

0

이것은 null-safe입니다.

Number tmp = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);
Long value1 = tmp == null ? null : tmp.longValue();

0

숫자의 정확한 클래스 ( Integer , Long , Double 등)를 모르는 경우 Number로 캐스트 하여 long 값을 가져올 수 있습니다.

Object num = new Integer(6);
Long longValue = ((Number) num).longValue();

-1

Long 유형의 목록의 경우 각 Integer 값 끝에 L 추가

List<Long> list = new ArrayList<Long>();
list  = Arrays.asList(1L, 2L, 3L, 4L);

-1

ConvertValue by Jackson 시도

ObjectMapper mapper = new ObjectMapper()
Integer a = 1;
Long b = mapper.convertValue(a, Long.class)

이것이 최선의 답변이 아니기 때문에 비추천 :이 솔루션은 불필요한 복잡성과 성능 오버 헤드를 추가하고 추가 라이브러리 (Jackson)를 필요로합니다
NickGreen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.