整数から長整数への変換


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);

問題は、私がキャストIntegerすることができないようですLong

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

これを達成するより良い方法はありますか?

Java 1.6を使用しています。

回答:


91

いいえ、あなたはキャストすることはできませんIntegerLongあなたから変換することができていても、intlong。以下のための個別番号であることが知られており、あなたが長い値を取得したいされている値、あなたが使用できます。

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

配列の場合、トリッキーになります...


配列の場合、a Number[]とそのループを使用して、適切に型指定された配列を作成できます。
Tiago Veloso

@Tiago:メソッドが実際に何を返すかに依存します。double[]たとえば、これ機能しませんが、Double[]
Jon Skeet、2011

7
IntegerからLongにキャストできないのはなぜですか?
MrMas 2013年

@MrMas:別々の参照型であるため、どちらもの直接のサブクラスですNumber。あなたが信じているの変換規則:またはそれを別の方法で配置するあなたが一方から他方へ変換してみましょうか?
Jon Skeet 2013年

6
OK。問題は継承です。精度について考えています。整数は、情報を失うことなく長整数に変換できます。しかし、継承構造には、コンパイラーにそれを伝える情報はありません。
MrMas 2013年

134

単に:

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

10
NPEは、整数がnullの場合にスローされます
lux

2
int価値のために働く。
dARKpRINCE 2015


このコードの作品(Javaは、暗黙的にunboxes Integerintし、その後にキャストlong廃止に渡す前にLong(long)、コンストラクタ。
オレ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 2013年

33
理由もなく文字列変換を導入するのは本当に悪い考えです...これを行うだけの利点はありません。
Jon Skeet 2013年

6
@JonSkeetに同意し、次のようにしてください:Object i = 10; Long l =((Number)i).longValue();
depsypher 2013年

1
この方法はうまく機能しますが、比較的低速で、これを行う他の方法よりも多くのメモリを使用します...
krispy

1
フロントエンドの開発者の観点から
見栄えがよい

8

整数をLongに変換する非常にシンプルで、その
例を変換する多くの方法1

 new Long(your_integer);

例2

Long.valueOf(your_integer); 

例3

Long a = 12345L;

例4
すでにintgerとして型指定されているintがある場合、これを行うことができます。

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

7

Integerの末尾に「L」を追加して、整数を直接longに変換します。

Long i = 1234L;

5
質問全体を読まずに、きっと答えられたと思います!
ディアブロ

3
@Diabloこの質問は、Googleで「int to long」を検索したときの最初の結果です。この回答は他のユーザーに役立つかもしれません
Dimitri 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




1

int変数からlong型へのパーサーがIntegerクラスに含まれています。次に例を示します。

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

この組み込み関数を簡単に使用して、from 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セーフです

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

0

数値の正確なクラス(IntegerLongDoubleなど)がわからない場合は、Numberにキャストして、そこからlong値を取得できます。

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


-1

ジャクソンで値を変換してみてください

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.