如何将对象转换为int


221

如何在Java中将对象转换为int?


6
你到底想干什么 如果Object不是Integer,我不确定您对演员表的期望。
unholysampler 2010年

2
首先用instanceof关键字检查。如果为true,则进行投射。
Dead Programmer 2010年

w 我只是想让枚举成员转换为特定的整数值,以便可以为winapi常数提供枚举。msdn.microsoft.com/en-us/library/windows/desktop/...
托马什Zato -恢复莫妮卡

@TomášZato您可以(在某种程度上)做到这一点,只需在枚举中定义一个字段以容纳整数值(例如intValue),为枚举创建一个构造函数以设置intValue,让您的枚举常量调用该构造函数,并添加一个吸气剂为intValue。然后,不进行强制转换,而是调用getter。
Brian McCutchon '16

Answers:


385

如果您确定该对象是Integer

int i = (Integer) object;

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

int i = (int) object;

当心,它可以抛出一个ClassCastException,如果你的对象是不是IntegerNullPointerException你要的对象是null

这样,您假设您的对象是一个整数(包装的int),然后将其拆箱为一个int。

int是基元,因此无法将其存储为Object,唯一的方法是将“ int考虑/装箱”为,Integer然后存储为Object


如果您的对象是String,则可以使用Integer.valueOf()方法将其转换为简单的int:

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

NumberFormatException如果您的对象不是真正的a String,并且内容为整数,则可能会引发a 。


资源:

在同一主题上:


您确定NullPointerException吗?我认为,一个空的对象将只产生一个空整数....
艾蒂安德马特尔

7
NullPointerException会在拆箱的发生Integerint
科林·赫伯特

您不是在强制转换为int,也不能将任何对象强制转换为int。您实际上是到Integer,然后自动装箱为int。
郭富城2010年

1
@Steve Kuo,是的,我的意思就是这样。这就是为什么我不使用“ cast”一词的原因。
科林·赫伯特

@Etienne:您可以将null对象转换为Integer,从而获得null Integer。但是,当您尝试从中提取int时,将得到一个null指针异常。没有“ null int”之类的东西。
杰伊

18

假设对象是Integer对象,则可以执行以下操作:

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

如果对象不是Integer对象,则必须检测类型并根据其类型进行转换。


如果obj为null,则将抛出NullPointerException。
科林·赫伯特

如果不是Integer对象,则返回ClassCastException。
埃里克·罗伯森

1
无需调用intValue自动装箱将为您调用它。
OscarRyz

1
intValue尤其是考虑到初学者与int可以互换之间的混淆,这更加清楚Integer
郭富城2010年

14

方案1:简单情况

如果可以确保您的对象是Integer,则这是简单的方法:

int x = (Integer)yourObject;

方案2:任何数字对象

在Java中IntegerLongBigInteger等一切落实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:身份哈希

在Java中没有指针。但是Object有一个类似指针的默认实现hashCode(),可以通过直接获得System.identityHashCode(Object o)。这样你就可以:

int x = System.identityHashCode(yourObject);

请注意,这不是真正的指针值。JVM可以更改对象的内存地址,同时保留其身份哈希值。同样,两个活动对象可以具有相同的身份哈希。

您也可以使用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 ++)。可能永远不需要将枚举对象转换为int,但是Java自动将索引号关联到每个枚举成员。可以通过访问该索引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 2010年

顺便说一句,您的正则表达式不考虑基数十六进制或八进制。ToInt是一种聪明的方法。最好尝试捕获NumberFormatExcepytion。
Extraneon 2010年

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;

这是一个漫长的过程。只是做(int)Object而不是Double.valueOf(object.toString())。intValue()。这仅适用于数字,这就是我们所需要的。
Sudhakar Krishnan 2014年

1
@SudhakarK:(int)对象仅在您的对象是Integer时才起作用。此单行代码还支持字符串数字。EG“ 332”。
Jacob van Lingen 2014年

2

如果Object最初将实例化为Integer,则可以使用强制转换int运算符将其向下转换为(Subtype)

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.

2

不能做 An 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

将对象强制转换为Object然后尝试将其设置为Integer变量时,如何编译。
卡洛斯(Carlos)2010年

2

你不能 An int不是一个Object

Integer是的Object,虽然,但我怀疑这是你的意思。


有自动装箱/拆箱自从Java 5
布鲁诺

@Bruno:您不能将Object转换为int。您可以将一个对象转换为一个整数,然后将其分配给一个整数,它将神奇地自动开箱。但是您不能将Object强制转换为int。
杰伊

(续)就我个人而言,我认为人们依靠自动装箱来创建许多不良代码。就像,前几天我看到一条声明,“ Double amount =(Double.parseDouble(stringAmount))。doubleValue();”。也就是说,他解析了一个String以获取一个double原语,然后对此执行了一个函数,这迫使编译器将其自动装箱为Double对象,但是该函数是doubleValue,它提取了double原语,然后将其分配给Double对象从而强制使用自动装箱。也就是说,他从原始对象转换为原始对象,然后进行了3次转换。
杰伊

@Jay,同意第一条评论(对不起,我不清楚自己)。关于太多的转换,您也是正确的,但是我得到的印象是,JIT编译器可以很好地解决这一问题,因此在实践中并没有太大关系(这不一定会使它成为不良代码的借口) ...)
布鲁诺

1
@Bruno自动装箱的棘手部分,它可以为您提供意想不到的NullPointerExceptions。
Extraneon 2010年

1

如果您的意思是将String强制转换为int,请使用Integer.valueOf("123")

但是,您不能将大多数其他对象强制转换为int,因为它们将没有int值。例如,XmlDocument没有int值。


1
不要使用Integer.valueOf("123"),如果你需要的是一个原始的,而不是使用Integer.parseInt("123"),因为的valueOf方法会导致不必要的拆箱。
KeremBaydoğan2010年

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

例如将对象强制转换为inthastaID

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,则进行投射。


我用了这个,现在我想知道如何解决该行上的“装箱的值被拆箱,然后再将immeditaley重新装箱”。(由于Spotbug的检查),所以现在我想知道如何更好地解决它。
贾斯珀·兰霍斯特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.