【问题标题】:How to cast an Object to an int如何将对象转换为 int
【发布时间】:2011-04-09 08:26:54
【问题描述】:

如何在 java 中将 Object 转换为 int?

【问题讨论】:

  • 你真正想做什么?如果Object 不是Integer,我不确定您对演员的期望。
  • 首先检查 instanceof 关键字。如果为真,则投射它。
  • 哇。我只是想让枚举成员转换为特定的整数值,这样我就可以拥有 winapi 常量的枚举。 msdn.microsoft.com/en-us/library/windows/desktop/…
  • @TomášZato 你可以这样做(有点),只需在你的枚举中定义一个字段来保存整数值(比如,intValue),为你的枚举创建一个构造函数来设置@987654325 @,让您的枚举常量调用该构造函数,并为intValue 添加一个getter。然后,调用 getter,而不是强制转换。

标签: java object casting integer


【解决方案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<>();
    //                               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

【讨论】:

    【解决方案2】:

    最后,找到了最适合您的规范的实现。

    public int tellMyNumber(Object any) {
        return 42;
    }
    

    【讨论】:

      【解决方案3】:
      so divide1=me.getValue()/2;
      
      int divide1 = (Integer) me.getValue()/2;
      

      【讨论】:

      • 这显示了需要强制转换的情况,我还将添加实际出现这种情况的错误。如果没有示例,新编码人员很难弄清楚实际的实现。我希望这个例子对他们有所帮助
      【解决方案4】:

      例如对象变量; hastaId

      Object hastaId = session.getAttribute("hastaID");
      

      例如将对象转换为 int,hastaID

      int hastaID=Integer.parseInt(String.valueOf(hastaId));
      

      【讨论】:

        【解决方案5】:
        @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 代替 a)吗? :) 不错的方法,但不对对象的类型做任何假设。
        • 顺便说一句,您的正则表达式不考虑基数十六进制或八进制。 ToInt 是一种聪明的方法。最好尝试捕获 NumberFormatExcepytion。
        【解决方案6】:

        你不能。 int 不是 Object

        虽然IntegerObject,但我怀疑这就是你的意思。

        【讨论】:

        • 从 Java 5 开始就有自动装箱/拆箱功能。
        • @Bruno:您不能将 Object 强制转换为 int。您可以将 Object 强制转换为 Integer,然后将其分配给 int,它会神奇地自动拆箱。但是您不能将 Object 强制转换为 int。
        • (续)就我个人而言,我认为人们依靠自动装箱创建了很多糟糕的代码。比如,前几天我看到了一个声明,“Double amount=(Double.parseDouble(stringAmount)).doubleValue();”。也就是说,他解析了一个 String 以获得一个 double 原语,然后针对它执行一个函数,这迫使编译器将其自动装箱为一个 Double 对象,但该函数是 doubleValue ,它提取了 double 原语,然后他将其分配给了 Double对象从而强制一个自动框。也就是他从原始到对象到原始到对象的转换,3次转换。
        • @Jay,同意第一条评论(对不起,我自己不清楚)。关于太多的转换,你也是对的,但我的印象是 JIT 编译器可以很好地处理这个问题,所以在实践中应该没那么重要(这并不一定让它成为糟糕代码的借口...)
        • @Bruno 自动装箱的棘手部分是它会给你带来意想不到的 NullPointerExceptions。
        【解决方案7】:

        参考此代码:

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

        【讨论】:

          【解决方案8】:
          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 很重要以及我们为什么使用它。只需从Object 转换int。可能会有所帮助。

          【讨论】:

          • 请解释一下你的答案
          【解决方案9】:

          我在处理来自 GSON 的数据时使用单线:

          int i = object != null ? Double.valueOf(object.toString()).intValue() : 0;
          

          【讨论】:

          • 这是一个漫长的过程。只需使用 (int)Object 而不是 Double.valueOf(object.toString()).intValue()。这仅适用于数字,这正是我们所需要的。
          • @SudhakarK: (int) 对象仅在您的对象是整数时才有效。这个 oneliner 还支持字符串数字;例如。 “332”。
          【解决方案10】:

          如果您确定该对象是Integer

          int i = (Integer) object;
          

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

          int i = (int) object;
          

          请注意,如果您的对象不是 Integer,它可能会抛出 ClassCastException,如果您的对象是 null,它可能会抛出 NullPointerException

          这样你就假设你的 Object 是一个 Integer(被包装的 int)并且你把它拆箱成一个 int。

          int 是一个原语,因此它不能存储为Object,唯一的方法是将int 考虑/装箱为Integer,然后存储为Object


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

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

          如果你的对象不是真正的String,它可以抛出一个NumberFormatException,并以整数作为内容。


          资源:

          关于同一主题:

          【讨论】:

          • 你确定 NullPointerException 吗?我认为空对象只会产生空整数....
          • NullPointerException 将在将Integer 拆箱到int 时发生
          • 你没有强制转换为 int,任何 Object 都不能强制转换为 int。你实际上是整数,然后自动装箱到一个 int。
          • @Steve Kuo,是的,正是我要说的。这就是为什么我没有使用“演员”这个词。
          • @Etienne:您可以将空对象强制转换为整数,从而获得空整数。但是当你试图从中提取 int 时,你会得到一个空指针异常。没有“null int”这样的东西。
          【解决方案11】:

          做不到。 int 不是对象,它是原始类型。您可以将其转换为 Integer,然后获取 int。

           Integer i = (Integer) o; // throws ClassCastException if o.getClass() != Integer.class
          
           int num = i; //Java 1.5 or higher
          

          【讨论】:

          • 这假定对象是一个整数,但几乎可以肯定它不是。可能想要的是字符串解决方案ala Coronauts
          • 当您将一个对象转换为 Object 然后尝试将其设置为 Integer 变量时,它如何编译。
          【解决方案12】:

          首先检查 instanceof 关键字。如果为真,则投射它。

          【讨论】:

          • 我用过这个,现在我想知道如何解决该行上的“盒装值被取消装箱,然后立即重新装箱”。 (由于spotbugs检查)所以现在我想知道如何更好地解决它。
          【解决方案13】:

          我猜你想知道为什么 C 或 C++ 允许你像操作数字一样操作对象指针,但在 Java 中却不能以同样的方式操作对象引用。

          Java 中的对象引用与 C 或 C++ 中的指针不同...指针基本上整数,您可以像处理任何其他 int 一样操作它们。引用是一种更具体的抽象,不能像指针那样被操纵。

          【讨论】:

            【解决方案14】:
            int i = (Integer) object; //Type is Integer.
            
            int i = Integer.parseInt((String)object); //Type is String.
            

            【讨论】:

              【解决方案15】:

              答案:

              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
              

              【讨论】:

                【解决方案16】:

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

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

                请注意,这仅在您使用至少 Java 1.5 和 autoboxing feature 时有效,否则您必须将 i 声明为 Integer,然后在其上调用 intValue().

                但如果它最初根本没有被创建为Integer,那么你就不能那样沮丧。这将导致 ClassCastException 在消息中带有原始类名。如果由String#valueOf() 获得的对象的toString() 表示表示语法上有效的整数(例如,仅数字,如果需要,前面带有减号),那么您可以为此使用Integer#valueOf()new Integer()

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

                另见:

                【讨论】:

                  【解决方案17】:

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

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

                  【讨论】:

                  • 如果您需要的只是一个原语,请不要使用Integer.valueOf("123"),而是使用Integer.parseInt("123"),因为 valueOf 方法会导致不必要的拆箱。
                  【解决方案18】:

                  假设对象是Integer 对象,那么你可以这样做:

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

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

                  【讨论】:

                  • 如果 obj 为 null,它将抛出 NullPointerException。
                  • 如果不是 Integer 对象,则返回 ClassCastException。
                  • 无需调用intValue,自动装箱会为您调用它。
                  • intValue 更加清晰,尤其是考虑到 intInteger 之间的初学者混淆。
                  【解决方案19】:

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-10-29
                    • 1970-01-01
                    • 2014-12-02
                    • 2017-09-26
                    • 2012-01-24
                    • 1970-01-01
                    • 2022-09-24
                    相关资源
                    最近更新 更多