- Как привести Объект к int
- 18 ответов
- Сценарий 1: простой случай
- Сценарий 2: любой числовой объект
- Сценарий 3: разобрать числовой текст
- Сценарий 4: хэш идентичности
- Сценарий 5: уникальный индекс
- Сценарий 6: член enum
- См. также:
- 2 Ways to Convert Object to Int in Java?
- String object to int Java using parseInt()
- Convert to int using valueOf()
- java.lang.NumberFormatException when changing object to int in Java
- Why Covert Java object to int?
- Custom Object to Int
Как привести Объект к int
Что вы действительно хотите сделать? Если Object не является целым Integer , я не уверен, что вы ожидаете от своего состава.
Оо. Я просто хотел, чтобы члены перечисления приводились к определенным целочисленным значениям, чтобы можно было иметь перечисления для констант winapi. msdn.microsoft.com/en-us/library/windows/desktop/.
@TomášZato TomášZato Вы можете сделать это (в некотором роде), просто определите поле в вашем перечислении для хранения целочисленного значения (скажем, intValue ), создайте конструктор для вашего перечисления, который устанавливает intValue , попросите константы перечисления вызвать этот конструктор и добавить получатель для intValue . Тогда, вместо того, чтобы кастовать, вызовите получателя.
18 ответов
Если вы уверены, что этот объект является Integer :
Или, начиная с Java 7, вы можете эквивалентно написать:
Опасайтесь, он может выбросить ClassCastException , если ваш объект не является Integer и NullPointerException , если ваш объект null .
Таким образом вы предполагаете, что ваш Object является Integer (завернутый int), и вы удаляете его в int.
int является примитивным, поэтому он не может быть сохранен как Object , единственный способ состоит в том, чтобы int рассматривался/помещался в коробку как Integer , а затем сохранялся как Object .
Если ваш объект является String , вы можете использовать метод Integer.valueOf() , чтобы преобразовать его в простой int:
int i = Integer.valueOf((String) object);
Он может выбросить NumberFormatException , если ваш объект на самом деле не является String с целым числом в качестве содержимого.
В той же теме:
Вы уверены в исключении NullPointerException? Я думал, что нулевой объект просто даст нулевое целое число .
Вы не преобразуете в int, ни один объект не может быть приведен к int. Вы на самом деле в Integer, а затем автобокс для int.
@Etienne: Вы можете привести нулевой объект к целому числу, получая, таким образом, нулевое целое число. Но когда вы попытаетесь извлечь int из него, вы получите исключение нулевого указателя. Там нет такого понятия, как «нулевой int».
Предполагая, что объект является объектом Integer , вы можете сделать это:
int i = ((Integer) obj).intValue();
Если объект не является объектом Integer , вам необходимо определить тип и преобразовать его в зависимости от его типа.
intValue намного понятнее, особенно учитывая путаницу между новичками в том, что int взаимозаменяемы с Integer .
Сценарий 1: простой случай
Если это гарантирует, что ваш объект является целым Integer , это простой способ:
Сценарий 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 Mapmap = 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++). Вероятно, никогда не требуется преобразовывать объект enum в int , однако Java автоматически назначает индексный номер каждому члену enum. К этому индексу можно получить доступ через Enum.ordinal() , например:
enum Foo < BAR, BAZ, QUX >// . Object baz = Foo.BAZ; int index = ((Enum)baz).ordinal(); // 1
@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 (е вместо)? 🙂 Хороший метод, однако, не делает никаких предположений о типе объекта.
Кстати, ваше регулярное выражение не принимает во внимание шестнадцатеричный гекс или окт. ToInt — это умный метод. Лучше попробовать поймать NumberFormatExcepytion.
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
Вы должны передать его в Integer (класс обертки int). Затем вы можете использовать метод Integer intValue() для получения внутреннего int.
Я использую однострочный вкладыш при обработке данных из GSON:
int i = object != null ? Double.valueOf(object.toString()).intValue() : 0;
Это длительный процесс. Просто сделайте (int) Object вместо Double.valueOf (object.toString ()). IntValue () . Это работает только для чисел, вот что нам нужно.
@SudhakarK: (int) Объект работает, только если ваш объект является целым числом. Этот oneliner также поддерживает числа String; EG «332».
Если Object изначально был создан как Integer , вы можете отключить его до int с помощью оператора трансляции (Subtype) .
Object object = new Integer(10); int i = (Integer) object;
Обратите внимание, что это работает только тогда, когда вы используете хотя бы Java 1.5 с функцией autoboxing, в противном случае вам нужно объявить i как Integer , а затем вызовите intValue() на нем.
Но если он изначально не был создан как Integer вообще, тогда вы не можете так упустить. Это приведет к ClassCastException с исходным именем класса в сообщении. Если объект toString() , как получено String#valueOf() обозначает синтаксически допустимое целочисленное число (например, только цифры, если необходимо с знаком минуса спереди), то вы можете использовать Integer#valueOf() или new Integer() для этого.
Object object = "10"; int i = Integer.valueOf(String.valueOf(object));
См. также:
int i = (Integer) object; //Type is Integer. int i = Integer.parseInt((String)object); //Type is String.
Вы не можете. int не является Object .
Integer является Object , хотя, но я сомневаюсь, что вы имеете в виду.
@Bruno: Бруно: Вы не можете привести объект к int. Вы можете привести Объект к Integer, а затем назначить его для типа int, и он будет волшебным образом автоматически установлен. Но вы не можете привести Объект к int.
(продолжение) Лично я думаю, что люди создают много плохого кода, полагаясь на автобокс. Например, на днях я видел утверждение: «Double amount = (Double.parseDouble (stringAmount)). DoubleValue ();». То есть он проанализировал String, чтобы получить двойной примитив, затем выполнил функцию против этого, что заставило компилятор автоматически помещать его в объект Double, но функция была doubleValue, которая извлекла двойной примитив, который он затем назначил для Double объект, таким образом, заставляя автобокс. То есть он преобразовал из примитива в объект в примитив в объект, 3 преобразования.
@Jay, согласился с первым комментарием (извини, я сам не понял). Что касается слишком большого количества преобразований, вы тоже правы, но у меня складывается впечатление, что JIT-компилятор может справиться с этим довольно хорошо, поэтому на практике это не должно иметь большого значения (это не обязательно делает его оправданием плохого кода). . )
@Bruno Сложная задача автобоксинга, которая может дать вам неожиданные исключения NullPointerException.
2 Ways to Convert Object to Int in Java?
Converting object to int is a simple work in Java. Addressing the problem straight away, we have two ways to work with.
The key difference is that parseInt() takes in only String as input. On another hand valueOf() accepts both Strings and Integers.
It must be noticed that parseInt() returns a primitive int type. Whereas valueOf() returns Integer object.
String object to int Java using parseInt()
Convert to int using valueOf()
Output
INTEGER VALUE: 1
Basically, int is the primitive data type whereas Integer is the wrapper class.
java.lang.NumberFormatException when changing object to int in Java
If a non-number String is passed to either Integer.parseInt() or Integer.valueOf() they throw a NumberFormatException. It is quite obvious that the Strings may contain a letter or any character that is not a number. For instance,
NumberFormatException Example
Exception in thread "main" java.lang.NumberFormatException: For input string: "hello"
This can be handled with Exception handling. Let’s create a simple try-catch block and fix that.
How to Fixed/solve java.lang.NumberFormatException for the above coding example?
public class ObjectToInt < public static void main(String[] args) < try < String s = new String("hello"); int i = Integer.valueOf(s); System.out.println("INT VALUE: "+i); >catch(NumberFormatException n) < System.out.println("NOT A NUMBER!!"); >> >
Why Covert Java object to int?
Now, if you are wondering why to convert Object to int in java, let’s take a look at this example. Say, we have to accept a comma-separated balance number as a String object and use it to calculate simple interest over a given period of time. Here we have to convert the String object to an int to calculate the simple interest using the formulae. Since arithmetic operations cannot be performed on a String object, the conversion is absolutely necessary.
Though using a double data type would be more practical, we have used int for simplicity. Try on your own for a better understanding. Use any of the two ways available. Here’s the solution for help.
Calculate Interest
public class CalcInterest < static int objectToInt(String s) < s = s.trim(); // to remove left and right trailing white spaces, if any. int num = 0; for(int i=0; i> return num; > public static void main(String[] args) < String balance = "1,000"; // dollar int rate = 8; // percent int time = 4; //years int principal = objectToInt(balance); int interest = (principal * rate * time)/100; System.out.println("Interest on "+balance+"$ for "+time+" years at "+rate+"% interest is "+interest+"$"); >>
Interest on 1,000$ for 4 years at 8% interest is 320$
So far, we have only converted objects of String type to int. But you know that objects can be of any type. What if you want to convert a custom Object to int type?
Custom Object to Int
Since we are confined to pass only String or Integers(in case of valueOf), we must convert our custom Object to String one way or the other. A simple way to do that is to override toString() . Lets’s take a look at an example. Here we have defined a class called MyNumber with an int value ‘i’.
MyNumber Class
class MyNumber < int i; public MyNumber(int i) < this.i = i; >@Override public String toString() < return i+""; >>
In line 6, notice the @Override annotation. The toString() method is defined in the Object class. The Object class is the parent class of all the classes in Java by default. So here in our class MyNumber, we redefine (override) the toString method to use as per our convenience.
Main Method
In the main method, we have created an object of this class MyNumber. Then we used the toString method to pass the int value I as a String. This String object is used as an input to the Integer.parseInt() method to be returned as a primitive int.
Like this article? Follow us on Facebook and LinkedIn. You can also subscribe to our weekly Feed.