Как привести Объект к int


221

Как я могу привести объект к int в Java?


6
Что вы действительно хотите сделать? Если Objectэто не так Integer, я не уверен, что вы ожидаете от своего состава.
unholysampler

2
сначала проверьте ключевое слово instanceof. если правда, тогда брось это.
Мертвый программист

Оо. Я просто хотел, чтобы члены перечисления приводились к конкретным целочисленным значениям, чтобы можно было иметь перечисления для констант winapi. msdn.microsoft.com/en-us/library/windows/desktop/...
Томаш Zato - восстановим Моника

@ TomášZato Вы можете сделать это (что-то вроде), просто определите поле в вашем перечислении для хранения целочисленного значения (скажем, intValue), создайте конструктор для вашего перечисления, который задает intValue, ваши константы перечисления вызывают этот конструктор, и добавьте метод получения для intValue. Тогда, вместо того, чтобы кастовать, вызовите получателя.
Брайан Маккатон

Ответы:


385

Если вы уверены, что этот объект является Integer:

int i = (Integer) object;

Или, начиная с Java 7, вы можете эквивалентно написать:

int i = (int) object;

Осторожно, он может выдать, ClassCastExceptionесли ваш объект не является, Integerи NullPointerExceptionесли ваш объект есть null.

Таким образом, вы предполагаете, что ваш объект является целым числом (обернутый int) и распаковываете его в int.

intявляется примитивом, поэтому он не может быть сохранен как Object, единственный способ состоит в том, чтобы intрассматривать / помечать как Integerсохраненный как Object.


Если ваш объект является a String, то вы можете использовать Integer.valueOf()метод для преобразования его в простое int:

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

Он может выдать, NumberFormatExceptionесли ваш объект на самом деле не Stringявляется целым с содержимым.


Ресурсы :

На ту же тему:


Вы уверены в исключении NullPointerException? Я думал, что нулевой объект просто даст нулевое целое число ...
Этьен Мартель

7
NullPointerExceptionБудет происходить во время распаковки из Integerвint
Colin Hebert

Вы не приводите к int, ни один объект не может быть приведен к int. Вы на самом деле в Integer, а затем автобокс для Int.
Стив Куо

1
@ Стив Куо, Да, именно то, что я говорю. Вот почему я не использовал слово «бросок».
Колин Хеберт

@Etienne: Вы можете привести нулевой объект к целому числу, получая, таким образом, нулевое целое число. Но когда вы попытаетесь извлечь int из него, вы получите исключение нулевого указателя. Там нет такого понятия, как «нулевой int».
Джей

18

Предполагая, что объект является Integerобъектом, вы можете сделать это:

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

Если объект не является Integerобъектом, то вы должны определить тип и преобразовать его на основе его типа.


Если obj имеет значение null, он выдаст исключение NullPointerException.
Колин Хеберт

и ClassCastException, если это не объект Integer.
Эрик Робертсон

1
Нет необходимости вызывать intValueдля автобокс будет вызывать его для вас.
ОскарРиз

1
intValueгораздо яснее, особенно если учесть путаницу между новичками intи взаимозаменяемость Integer.
Стив Куо

14

Сценарий 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():

int x = Integer.parseInt(input.toString());

Сценарий 4: хэш идентичности

В Java нет указателей. Однако Objectимеет указатель-подобную реализацию по умолчанию для hashCode(), которая напрямую доступна через System.identityHashCode(Object o). Так что вы можете:

int x = System.identityHashCode(yourObject);

Обратите внимание, что это не реальное значение указателя. Адрес памяти объектов может быть изменен JVM, в то время как их хеши идентичности сохраняются. Кроме того, два живых объекта могут иметь одинаковый хеш-идентификатор.

Вы также можете использовать object.hashCode(), но это может быть конкретным типом.

Сценарий 5: уникальный индекс

В тех же случаях вам нужен уникальный индекс для каждого объекта, например, для автоматического увеличения значений идентификаторов в таблице базы данных (и в отличие от идентификатора, который не является уникальным). Простой пример реализации для этого:

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: член enum

В 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 (е вместо)? :) Хотя хороший метод, не делает никаких предположений о типе объекта.
extraneon

Кстати, ваше регулярное выражение не принимает во внимание шестнадцатеричный гекс или окт. 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;

Это длительный процесс. Просто сделайте (int) Object вместо Double.valueOf (object.toString ()). IntValue () . Это работает только для чисел, вот что нам нужно.
Судхакар Кришнан

1
@SudhakarK: (int) Объект работает, только если ваш объект является целым числом. Этот oneliner также поддерживает номера строк; ЭГ "332".
Джейкоб ван Линген

2

Если Objectизначально объект был создан как a 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

Не может быть сделано An intэто не объект, это примитивный тип. Вы можете привести его к Integer, а затем получить int.

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

 int num = i; //Java 1.5 or higher

Это предполагает, что объект является целым числом, которым он почти наверняка не является. Наверное, хочу это струнное решение аля Коронавты
Билл К

Как это могло скомпилироваться, когда вы приводите объект в Object, а затем пытаетесь установить его в переменную Integer.
Карлос

2

Ты не можешь Ан intне есть Object.

Integerэто Objectправда, но я сомневаюсь , что это то , что вы имеете в виду.


Начиная с Java 5, есть автоматический бокс / распаковка
Бруно

@ Бруно: Вы не можете привести объект к int. Вы можете привести Объект к Integer, а затем назначить его для типа int, и он волшебным образом будет автоматически установлен. Но вы не можете привести Объект к int.
Джей

(продолжение) Лично я думаю, что люди создают много плохого кода, полагаясь на автобокс. Например, на днях я видел утверждение: «Double amount = (Double.parseDouble (stringAmount)). DoubleValue ();». То есть он проанализировал String, чтобы получить двойной примитив, затем выполнил функцию против этого, что заставило компилятор автоматически помещать его в объект Double, но функция была doubleValue, которая извлекла двойной примитив, который он затем назначил для Double объект, таким образом, заставляя автобокс. То есть он преобразовал из примитива в объект в примитив в объект, 3 преобразования.
Джей

@Jay, согласился на 1-й комментарий (извини, я сам не понял). Что касается слишком большого количества преобразований, вы тоже правы, но у меня сложилось впечатление, что JIT-компилятор может справиться с этим довольно хорошо, поэтому на практике это не должно иметь большого значения (это не обязательно делает его оправданием плохого кода ...)
Бруно

1
@Bruno Сложная задача автобоксинга, которая может дать вам неожиданные исключения NullPointerException.
extraneon

1

Если вы имеете в виду приведение String к int, используйте Integer.valueOf("123").

Вы не можете привести большинство других объектов к int, потому что они не будут иметь значения int. Например, XmlDocument не имеет значения int.


1
Не используйте, Integer.valueOf("123")если все, что вам нужно, это примитив, вместо этого используйте, Integer.parseInt("123")потому что метод valueOf вызывает ненужную распаковку.
Керем Байдоган

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;

Это показывает ситуацию, когда требуется приведение, и я также добавлю ошибку, которая фактически обнаруживается в этой ситуации. Новому кодировщику сложно понять фактическую реализацию, если нет примера. Я надеюсь, что этот пример поможет им
Нехал Павар

0

Наконец, лучшая реализация для вашей спецификации была найдена.

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

-4

сначала проверьте ключевое слово instanceof. если правда, тогда брось это.


Я использовал это, и теперь я задаюсь вопросом, как решить, «в штучной упаковке значение распаковано, а затем immeditaley reboxed» в этой строке. (Из-за проверок на предмет ошибок), так что теперь я задаюсь вопросом, как решить это лучше.
Джаспер Ланкхорст
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.