如何将一个对象转换为整数

265

在Java中,我如何将一个对象强制转换为int类型?


6
你真正想要做什么?如果“Object”不是一个“整数”,我不确定你从类型转换中期望得到什么。 - unholysampler
2
首先使用 instanceof 关键字进行检查。如果为真,则进行强制类型转换。 - Dead Programmer
唉,我只是想要枚举成员以转换为特定的整数值,这样我就可以使用枚举来表示winapi常量。https://msdn.microsoft.com/en-us/library/windows/desktop/ms646244%28v=vs.85%29.aspx - Tomáš Zato
@TomášZato 你可以这样做(有点类似),只需在枚举中定义一个字段来保存整数值(比如 intValue),为枚举创建一个设置 intValue 的构造函数,让枚举常量调用该构造函数,并添加一个获取器以获取 intValue。然后,不要进行强制转换,而是调用获取器。 - Brian McCutchon
22个回答

436

如果您确定该对象是一个整数

int i = (Integer) object;

或者,从Java 7开始,您可以等效地编写:

int i = (int) object;

注意,如果您的对象不是Integer,它可能会抛出ClassCastException,如果您的对象为null,它可能会抛出NullPointerException
这样做是因为您假定您的对象是一个整数(包装的整数),并将其解包为一个整数。 int是原始类型,因此无法存储为Object,唯一的方法是将一个int视为Integer并存储为Object
如果您的对象是一个String,那么您可以使用Integer.valueOf()方法将其转换为简单的int类型:
int i = Integer.valueOf((String) object);

如果您的对象不是一个包含整数内容的String,它可能会抛出一个NumberFormatException异常。


资源:

相关主题:


10
当将Integer拆箱为int时,会发生NullPointerException - Colin Hebert
你没有将其转换为int,任何对象都无法转换为int。实际上,你是将其转换为Integer,然后自动装箱为int。 - Steve Kuo
1
@Steve Kuo,没错,就是我想说的。这就是为什么我没有使用“转换”这个词。 - Colin Hebert
@Etienne:你可以将一个空对象转换为整数,从而得到一个空整数。但是当你尝试从中提取int时,你会得到一个空指针异常。不存在所谓的“null int”。 - Jay
使用 int i = Integer.valueOf(object.toString())。 - Narendra Rawat
显示剩余3条评论

25

场景1:简单案例

如果你可以保证你的对象是一个 Integer,这是一种简单的方式:

int x = (Integer)yourObject;

情景2:任何数字对象
在Java中,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():
如果您的输入是对象,您可以使用(String)input进行转换,或者如果它可能有其他文本类型,则可以使用input.toString()进行转换。
int x = Integer.parseInt(input.toString());

场景 4: 标识哈希

Java语言中没有指针。然而,Object类有一种类似指针的默认实现方式,可以通过System.identityHashCode(Object o) 方法来直接获取hashCode()值。因此,您可以:

int x = System.identityHashCode(yourObject);

请注意,这不是一个真正的指针值。对象的内存地址可以被JVM更改,而它们的身份哈希值保持不变。此外,两个活动对象可能具有相同的身份哈希值。

您还可以使用object.hashCode(),但它可能是特定类型的。

场景5:唯一索引

在某些情况下,您需要为每个对象设置唯一索引,例如自动递增ID值的数据库表(与不唯一的身份哈希值不同)。以下是一个简单的示例实现:

class ObjectIndexer {
    
    private int index = 0;
    
    private Map<Object, Integer> map = new WeakHashMap<>();
    //                               or:
    //                                 new WeakIdentityHashMap<>();
    
    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++不同)。可能永远不需要将枚举对象转换为int,但是Java会自动为每个枚举成员关联一个索引号。此索引可以通过Enum.ordinal()访问,例如:

enum Foo { BAR, BAZ, QUX }

// ...

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

enter image description here


20
假设对象是一个Integer对象,你可以这样做:
int i = ((Integer) obj).intValue();
如果该对象不是Integer对象,则必须检测类型并基于其类型进行转换。

如果 obj 为空,它将抛出 NullPointerException。 - Colin Hebert
如果它不是一个整数对象,则返回ClassCastException。 - Erick Robertson
1
不需要调用 intValue,因为自动装箱会为您调用它。 - OscarRyz
1
intValue 更清晰,特别是考虑到初学者容易混淆 intInteger 可互换的情况。 - Steve Kuo

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

正如您所看到的,这并不是一个非常有效的方法。您只需要确定所拥有的对象的类型,然后以正确的方式将其转换为整数。


这不应该是@Deprecated(使用e而不是a)吗? :) 不过很好的方法,不对对象类型做任何假设。 - extraneon
顺便提一下,你的正则表达式没有考虑十六进制或八进制基数。ToInt 是一个聪明的方法。最好用 try 和 catch NumberFormatException。 - extraneon

4

答案:

int i = ( Integer ) yourObject;

如果你的对象已经是一个整数,那么它将会顺利运行。例如:

Object yourObject = 1;
//  cast here

或者

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

如果您的对象不是整数,您需要先将它(如果可能)转换为整数:

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;

这是一个冗长的过程。只需使用**(int)Object代替Double.valueOf(object.toString()).intValue()**即可。这仅适用于数字,这正是我们所需要的。 - Sudhakar Krishnan
1
@SudhakarK: (int) 对象仅在您的对象为整数时起作用。这个一行代码也支持字符串数字;例如:“332”。 - Jacob van Lingen

4

您需要将其转换为整数(int的包装类)。然后,您可以使用Integer的intValue()方法获取内部int。


2
例如对象变量:hastaId
Object hastaId = session.getAttribute("hastaID");

例如将一个对象转换为整数:hastaID
int hastaID=Integer.parseInt(String.valueOf(hastaId));

2
如果Object最初被实例化为Integer,那么您可以使用强制类型转换运算符(Subtype)将其向下转换为int
Object object = new Integer(10);
int i = (Integer) object;

请注意,这仅在您使用至少带有自动装箱特性的Java 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.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接