オブジェクトをintにキャストする方法


221

Javaでオブジェクトをintにキャストするにはどうすればよいですか?


6
あなたは本当に何をしたいですか?Objectがでない場合、Integerキャストに何を期待しているのかわかりません。
unholysampler

2
まずinstanceofキーワードで確認します。trueの場合はキャストします。
デッドプログラマ

ああ。enapiメンバーを特定の整数値にキャストして、winapi定数のenumを取得できるようにしたかっただけです。msdn.microsoft.com/en-us/library/windows/desktop/…–TomášZato-
モニカを

@TomášZatoこれを行うことができます(整数の値を保持する列挙型のフィールドを定義するなどintValue)、列挙型のコンストラクターを作成して列挙型を設定しintValue、列挙型定数でそのコンストラクターを呼び出し、ゲッターを追加しますのためにintValue。次に、キャストする代わりに、ゲッターを呼び出します。
ブライアン・マッカッチョン2016年

回答:


385

このオブジェクトが確実である場合Integer

int i = (Integer) object;

または、Java 7以降では、次のように書くこともできます。

int i = (int) object;

注意してください、それはClassCastExceptionあなたのオブジェクトがでないなら、Integerそしてあなたのオブジェクトがであるなら、を投げることができNullPointerExceptionますnull

このようにして、オブジェクトが整数(ラップされたint)であると想定し、ボックス化してintにします。

intはプリミティブであるためObject、として格納できません。唯一の方法は、int検討/ボックス化Integerされたをとして格納し、として格納することObjectです。


オブジェクトがの場合StringInteger.valueOf()メソッドを使用して、オブジェクトを単純なintに変換できます。

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

NumberFormatExceptionオブジェクトが実際にString整数をコンテンツとして持たない場合は、をスローできます。


リソース:

同じトピックについて:


NullPointerExceptionについて確信がありますか?nullオブジェクトはnull整数を生成するだけだと思いました...
Etienne de Martel

7
NullPointerExceptionアンボクシングの間に起こるであろうIntegerint
コリン・エベール

あなたはintにキャストしていません、オブジェクトをintにキャストすることはできません。あなたは実際には整数になり、次にintにオートボクシングしています。
Steve Kuo

1
@Steve Kuo、うん、まさしく私が言っていること。だから私は「キャスト」という言葉を使わなかった。
Colin Hebert

@Etienne:nullオブジェクトをIntegerにキャストして、null Integerを取得できます。しかし、そこからintを抽出しようとすると、nullポインタ例外が発生します。「null int」のようなものはありません。
Jay

18

オブジェクトがオブジェクトであると仮定すると、Integerこれを行うことができます:

int i =((Integer)obj).intValue();

オブジェクトがオブジェクトでない場合はInteger、型を検出し、その型に基づいて変換する必要があります。


objがnullの場合、NullPointerExceptionをスローします。
Colin Hebert

そしてそれがIntegerオブジェクトでない場合はClassCastException。
エリックロバートソン

1
intValueオートボクシングのために呼び出す必要はありません。
OscarRyz

1
intValueは、intと交換可能であるという初心者の混乱を特に考慮すると、はるかに明確になりIntegerます。
Steve Kuo

14

シナリオ1:単純なケース

オブジェクトがであることが保証されている場合Integer、これは簡単な方法です。

int x = (Integer)yourObject;

シナリオ2:任意の数値オブジェクト

Java IntegerではLongBigIntegerなどすべて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によって変更できます。また、2つの生きているオブジェクトが同じIDハッシュを持つことができます。

も使用object.hashCode()できますが、タイプ固有にすることもできます。

シナリオ5:一意のインデックス

同じ場合に、データベーステーブルの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オブジェクトをに変換する必要はありませんが、intJavaはインデックス番号を各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の代わりに)?:)しかし、素敵なメソッドは、オブジェクトのタイプを想定していません。
extraneon

ところで、あなたの正規表現は基数の16進数や8進数を考慮していません。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を実行するだけです。これは、数値に対してのみ機能します。
ダカールクリシュナン2014

1
@SudhakarK:(int)オブジェクトは、オブジェクトが整数の場合にのみ機能します。このワンライナーは文字列番号もサポートしています。EG "332"。
Jacob van Lingen、2014

2

Objectがもともととしてインスタンス化されていた場合は、キャスト演算子を使用してにIntegerダウンキャストできます。int(Subtype)

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

これは、オートボクシング機能を備えた少なくともJava 1.5を使用している場合にのみ機能することに注意してください。それ以外の場合はiInteger代わりに宣言してから呼び出す必要intValue()があります。

しかし、それが最初からまったく作成されていなかった場合Integer、そのようにダウンキャストすることはできません。その結果ClassCastException、メッセージに元のクラス名が含まれます。toString()によって取得されたオブジェクトの表現String#valueOf()が構文的に有効な整数値(たとえば、必要に応じて前にマイナス記号を付けた数字のみ)を示している場合、Integer#valueOf()またはnew Integer()を使用できます。

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

以下も参照してください。



2

できません。intそれはプリミティブ型ですが、オブジェクトではありません。それをIntegerにキャストしてから、intを取得できます。

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

 int num = i; //Java 1.5 or higher

これは、オブジェクトがほぼ間違いなく整数であると想定しています。たぶん、Colonautsの文字列ソリューションが欲しい
Bill K

オブジェクトをObjectにキャストし、それをInteger変数に設定しようとすると、どのようにコンパイルできますか?
Carlos

2

できません。アンはintありませんObject

IntegerとはObjectいえ、それがあなたの言いたいことだとは思いません。


Java 5以降、自動ボクシング/アンボクシングがあります
Bruno

@Bruno:オブジェクトをintにキャストすることはできません。オブジェクトをIntegerにキャストし、それをintに割り当てると、魔法のように自動ボックス化解除されます。ただし、オブジェクトをintにキャストすることはできません。
Jay

(続き)個人的には、オートボクシングに依存する悪いコードをたくさん作成していると思います。同様に、先日、「Double amount =(Double.parseDouble(stringAmount))。doubleValue();」というステートメントを見ました。つまり、彼はStringを解析してdoubleプリミティブを取得し、これに対して関数を実行しました。これにより、コンパイラーはそれをDoubleオブジェクトにオートボックス化しましたが、関数はdoubleValueであり、doubleプリミティブを抽出し、それをDoubleに割り当てました。したがって、オートボックスを強制します。つまり、彼はプリミティブからオブジェクトへ、プリミティブからオブジェクトへ、3回の変換で変換しました。
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")
KeremBaydoğan10年

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


-4

まずinstanceofキーワードで確認します。trueの場合はキャストします。


私はこれを使用しましたが、その行で「ボックス化された値はボックス化解除され、次にイメディタリーが再ボックス化されました」を解決する方法を知りたいと思います。(spotbugsのチェックのため)だから、私はそれをよりよく解決する方法を考えています。
Jasper Lankhorst
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.