Як віддати об’єкт до int


221

Як я можу закинути об’єкт до int в java?


6
Що ти насправді хочеш зробити? Якщо Objectце не так Integer, я не впевнений, що ви очікуєте від своєї ролі.
unholysampler

2
спочатку перевірте ключове слово instanceof. якщо правда, тоді киньте його.
Мертвий програміст

Aww. Я просто хотів, щоб члени перерахунку привели до конкретних цілих значень, щоб я міг мати перерахунки для констант винапі. msdn.microsoft.com/en-us/library/windows/desktop/…
Томаш Зато - Відновити Моніку

@ TomášZato Ви можете це зробити (на зразок), просто визначте поле у ​​вашій enum, щоб утримувати ціле значення (скажімо, intValue), створити конструктор для перерахунку, який задає intValue, щоб константи enum викликали цей конструктор, і додати getter для intValue. Потім замість кастингу зателефонуйте геттеру.
Брайан Маккотчон

Відповіді:


385

Якщо ви впевнені, що цей об'єкт є Integer:

int i = (Integer) object;

Або, починаючи з Java 7, можна рівнозначно написати:

int i = (int) object;

Остерігайтеся, він може кинути, ClassCastExceptionякщо ваш об'єкт не є, Integerа NullPointerExceptionякщо ваш об'єкт null.

Таким чином, ви припускаєте, що ваш Об'єкт є цілим числом (загорнутий int), і ви розблоковуєте його в int.

intє примітивом, тому його не можна зберігати як Object, єдиний спосіб - intрозглянути / позначений у коробці як Integerтоді збережений як Object.


Якщо ваш об'єкт є String, то ви можете використовувати Integer.valueOf()метод для перетворення його в простий int:

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

Він може кинути, NumberFormatExceptionякщо ваш об’єкт насправді не Stringє цілим числом як вміст.


Ресурси:

На цю ж тему:


Ви впевнені в NullPointerException? Я думав, що нульовий об’єкт просто дасть нульовий цілий номер ....
Етьєн де Мартель

7
NullPointerExceptionВідбуватиметься під час розпакування з Integerвint
Colin Hebert

Ви не вкладаєте до int, жоден об'єкт ніколи не може бути переданий до int. Ви насправді до Integer, а потім автозавантаження до int.
Стів Куо

1
@Steve Kuo, так, саме те, що я говорю. Ось чому я не використав слово "литий".
Колін Геберт

@Etienne: Ви можете присвоїти нульовий об'єкт цілому числу, отримавши таким чином нульовий цілий. Але якщо ви спробуєте витягти з нього int, ви отримаєте нульове виключення вказівника. Немає такого поняття, як "null int".
Джей

18

Якщо припустити, що об’єкт є Integerоб'єктом, то ви можете це зробити:

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

Якщо об’єкт не є Integerоб’єктом, то вам доведеться виявити тип і перетворити його на основі його типу.


Якщо obj є null, він кине NullPointerException.
Колін Геберт

і ClassCastException, якщо це не об'єкт Integer.
Ерік Робертсон

1
Немає необхідності посилатися intValueна автобоксинг, це буде викликати його за вас.
OscarRyz

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: розбір числового тексту

Коли ви приймаєте введення користувача з командного рядка (або текстового поля тощо), ви отримуєте це як a 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: член перерахунку

У Java enum учасники не цілі числа, а повнофункціональні об'єкти (наприклад, на відміну від C / C ++). Можливо, ніколи не потрібно перетворювати об’єкт enum int, однак Java автоматично прив'язує номер індексу до кожного члена enum. Доступ до цього індексу можна 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 правильним шляхом.


Хіба це не встановлено @ (не замість нього)? :) Хороший метод, однак, не передбачає припущень щодо типу об'єкта.
екстранеон

До речі, ваш регекс не враховує радикс-шестигранник чи окт. ToInt - розумний метод. Краще спробувати зловити NumberFormatExcepytion.
екстранеон

4

Ви повинні передавати його цілому (класу обгортки int). Потім можна використовувати метод intValue () Integer для отримання внутрішнього 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) об'єкт замість Double.valueOf (object.toString ()). IntValue () . Це працює лише для чисел, ось що нам потрібно.
Sudhakar Krishnan

1
@SudhakarK: (int) Об'єкт працює лише в тому випадку, якщо ваш об'єкт є Цілим числом. Цей oneliner також підтримує рядкові номери; EG "332".
Якоб ван Лінген

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не об’єкт, це примітивний тип. Ви можете віддати це до 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.
Бруно

@Bruno: Ви не можете передавати об'єкт до int. Ви можете кинути об'єкт на цілий ряд, а потім призначити його до int, і він буде магічно відкривати скриньку. Але ви не можете закинути об'єкт до int.
Джей

(продовження) Особисто я думаю, що люди створюють багато поганого коду, спираючись на автобоксинг. Мовляв, днями я побачив вислів: "Подвійна сума = (Double.parseDouble (stringAmount)). DoubleValue ();". Тобто, він проаналізував String, щоб отримати подвійний примітив, а потім виконав функцію проти цього, що змусило компілятора автобоксувати його в об'єкт Double, але функція була doubleValue, яка витягла подвійний примітив, який він потім призначив Double Об'єкт, таким чином, примушує автобокс. Тобто він перетворив з примітивного в об’єкт до примітивного на об'єкт, 3 перетворення.
Джей

@Jay, погодився на 1-й коментар (вибачте, я сам не зрозумів). Щодо занадто великої кількості конверсій, ви теж маєте рацію, але у мене складається враження, що компілятор JIT може впоратися з цим досить добре, тому на практиці це не повинно мати великого значення (це не обов'язково робить приводом для поганого коду ...)
Бруно

1
@Bruno Хитрість автобоксингу - це те, що він може отримати несподівані NullPointerExceptions.
екстранеон

1

Якщо ви маєте на увазі присвоєння рядка до 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. якщо правда, тоді киньте його.


Я використовував це, і тепер мені цікаво, як вирішити "Значення в коробці без коробки, а потім негайно перезавантажено" в цьому рядку. (Через перевірки плям), тому зараз мені цікаво, як це краще вирішити.
Джаспер Ланкхорст
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.