Как привести Объект к 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.