场景一:简单案例
如果保证您的对象是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():
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