@ TomášZato Вы можете сделать это (что-то вроде), просто определите поле в вашем перечислении для хранения целочисленного значения (скажем, intValue), создайте конструктор для вашего перечисления, который задает intValue, ваши константы перечисления вызывают этот конструктор, и добавьте метод получения для intValue. Тогда, вместо того, чтобы кастовать, вызовите получателя.
Брайан Маккатон
Ответы:
385
Если вы уверены, что этот объект является Integer:
int i =(Integer) object;
Или, начиная с Java 7, вы можете эквивалентно написать:
Таким образом, вы предполагаете, что ваш объект является целым числом (обернутый 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: уникальный индекс
В тех же случаях вам нужен уникальный индекс для каждого объекта, например, для автоматического увеличения значений идентификаторов в таблице базы данных (и в отличие от идентификатора, который не является уникальным). Простой пример реализации для этого:
ObjectIndexer indexer =newObjectIndexer();int x = indexer.indexFor(yourObject);// 1int y = indexer.indexFor(newObject());// 2int z = indexer.indexFor(yourObject);// 1
Сценарий 6: член enum
В Java члены перечисления - не целые числа, а полнофункциональные объекты (в отличие, например, от C / C ++). Вероятно, никогда не требуется преобразовывать объект перечисления int, однако Java автоматически назначает индексный номер каждому члену перечисления. К этому индексу можно получить доступ Enum.ordinal(), например, через:
enumFoo{ BAR, BAZ, QUX }// ...Object baz =Foo.BAZ;int index =((Enum)baz).ordinal();// 1
Как видите, это не очень эффективный способ сделать это. Вы просто должны быть уверены в том, какой у вас объект. Затем преобразуйте его в int правильным способом.
Разве это не @Deprecated (е вместо)? :) Хотя хороший метод, не делает никаких предположений о типе объекта.
extraneon
Кстати, ваше регулярное выражение не принимает во внимание шестнадцатеричный гекс или окт. ToInt - это умный метод. Лучше попробовать поймать NumberFormatExcepytion.
Extraneon
4
Вы должны привести его к Integer (классу-оболочке int). Затем вы можете использовать метод Integer intValue () для получения внутреннего int.
Это длительный процесс. Просто сделайте (int) Object вместо Double.valueOf (object.toString ()). IntValue () . Это работает только для чисел, вот что нам нужно.
Судхакар Кришнан
1
@SudhakarK: (int) Объект работает, только если ваш объект является целым числом. Этот oneliner также поддерживает номера строк; ЭГ "332".
Джейкоб ван Линген
2
Если Objectизначально объект был создан как a Integer, то вы можете уменьшить его до intоператора приведения (Subtype).
Object object =newInteger(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));
Начиная с 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.
Не используйте, Integer.valueOf("123")если все, что вам нужно, это примитив, вместо этого используйте, Integer.parseInt("123")потому что метод valueOf вызывает ненужную распаковку.
Керем Байдоган
1
Я думаю, вы задаетесь вопросом, почему C или C ++ позволяют вам манипулировать указателем объекта, как числом, но вы не можете манипулировать ссылкой на объект в Java таким же образом.
Ссылки на объекты в Java не похожи на указатели в C или C ++ ... Указатели в основном являются целыми числами, и вы можете манипулировать ими, как любой другой тип int Ссылки намеренно представляют собой более конкретную абстракцию, и ими нельзя манипулировать так, как это делают указатели.
int[] getAdminIDList(String tableName,String attributeName,int value)throwsSQLException{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[]=newint[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. Может быть, это полезно.
Это показывает ситуацию, когда требуется приведение, и я также добавлю ошибку, которая фактически обнаруживается в этой ситуации. Новому кодировщику сложно понять фактическую реализацию, если нет примера. Я надеюсь, что этот пример поможет им
Нехал Павар
0
Наконец, лучшая реализация для вашей спецификации была найдена.
Я использовал это, и теперь я задаюсь вопросом, как решить, «в штучной упаковке значение распаковано, а затем immeditaley reboxed» в этой строке. (Из-за проверок на предмет ошибок), так что теперь я задаюсь вопросом, как решить это лучше.
Object
это не такInteger
, я не уверен, что вы ожидаете от своего состава.intValue
), создайте конструктор для вашего перечисления, который задаетintValue
, ваши константы перечисления вызывают этот конструктор, и добавьте метод получения дляintValue
. Тогда, вместо того, чтобы кастовать, вызовите получателя.Ответы:
Если вы уверены, что этот объект является
Integer
:Или, начиная с Java 7, вы можете эквивалентно написать:
Осторожно, он может выдать,
ClassCastException
если ваш объект не является,Integer
иNullPointerException
если ваш объект естьnull
.Таким образом, вы предполагаете, что ваш объект является целым числом (обернутый int) и распаковываете его в int.
int
является примитивом, поэтому он не может быть сохранен какObject
, единственный способ состоит в том, чтобыint
рассматривать / помечать какInteger
сохраненный какObject
.Если ваш объект является a
String
, то вы можете использоватьInteger.valueOf()
метод для преобразования его в простое int:Он может выдать,
NumberFormatException
если ваш объект на самом деле неString
является целым с содержимым.Ресурсы :
На ту же тему:
источник
NullPointerException
Будет происходить во время распаковки изInteger
вint
Предполагая, что объект является
Integer
объектом, вы можете сделать это:Если объект не является
Integer
объектом, то вы должны определить тип и преобразовать его на основе его типа.источник
intValue
для автобокс будет вызывать его для вас.intValue
гораздо яснее, особенно если учесть путаницу между новичкамиint
и взаимозаменяемостьInteger
.Сценарий 1: простой случай
Если гарантируется, что ваш объект является
Integer
, это простой способ:Сценарий 2: любой числовой объект
В Java
Integer
,Long
, иBigInteger
т.д. все реализоватьNumber
интерфейс , который имеет метод с именемintValue
. Любые другие пользовательские типы с числовым аспектом также должны быть реализованыNumber
(например:)Age implements Number
. Так что вы можете:Сценарий 3: разобрать числовой текст
Когда вы принимаете пользовательский ввод из командной строки (или текстового поля и т. Д.), Вы получаете его как
String
. В этом случае вы можете использоватьInteger.parseInt(String string)
:Если вы получаете вход , как
Object
вы можете использовать(String)input
, или, если это может иметь другой текстовый тип,input.toString()
:Сценарий 4: хэш идентичности
В Java нет указателей. Однако
Object
имеет указатель-подобную реализацию по умолчанию дляhashCode()
, которая напрямую доступна черезSystem.identityHashCode(Object o)
. Так что вы можете:Обратите внимание, что это не реальное значение указателя. Адрес памяти объектов может быть изменен JVM, в то время как их хеши идентичности сохраняются. Кроме того, два живых объекта могут иметь одинаковый хеш-идентификатор.
Вы также можете использовать
object.hashCode()
, но это может быть конкретным типом.Сценарий 5: уникальный индекс
В тех же случаях вам нужен уникальный индекс для каждого объекта, например, для автоматического увеличения значений идентификаторов в таблице базы данных (и в отличие от идентификатора, который не является уникальным). Простой пример реализации для этого:
Использование:
Сценарий 6: член enum
В Java члены перечисления - не целые числа, а полнофункциональные объекты (в отличие, например, от C / C ++). Вероятно, никогда не требуется преобразовывать объект перечисления
int
, однако Java автоматически назначает индексный номер каждому члену перечисления. К этому индексу можно получить доступEnum.ordinal()
, например, через:источник
Как видите, это не очень эффективный способ сделать это. Вы просто должны быть уверены в том, какой у вас объект. Затем преобразуйте его в int правильным способом.
источник
Вы должны привести его к Integer (классу-оболочке int). Затем вы можете использовать метод Integer intValue () для получения внутреннего int.
источник
Ответ:
Если ваш объект уже является целым числом, он будет работать гладко. то есть:
или
и т.п.
Если ваш объект является чем-то еще, вам нужно сначала преобразовать его (если возможно) в int:
Или
источник
Я использую однострочник при обработке данных из GSON:
источник
Если
Object
изначально объект был создан как aInteger
, то вы можете уменьшить его доint
оператора приведения(Subtype)
.Обратите внимание, что это работает только тогда, когда вы используете хотя бы Java 1.5 с функцией автобокса , в противном случае вы должны объявить
i
какInteger
вместо, а затем вызватьintValue()
его .Но если он изначально не был создан как таковой
Integer
, вы не можете так опускать руки. Это привело быClassCastException
к исходному имени класса в сообщении. Если представление объекта,toString()
полученное с помощью,String#valueOf()
обозначает синтаксически допустимое целое число (например, только цифры, если необходимо, со знаком минус перед), то вы можете использоватьInteger#valueOf()
илиnew Integer()
для этого.Смотрите также:
источник
источник
Не может быть сделано An
int
это не объект, это примитивный тип. Вы можете привести его к Integer, а затем получить int.источник
Ты не можешь Ан
int
не естьObject
.Integer
этоObject
правда, но я сомневаюсь , что это то , что вы имеете в виду.источник
Если вы имеете в виду приведение String к int, используйте
Integer.valueOf("123")
.Вы не можете привести большинство других объектов к int, потому что они не будут иметь значения int. Например, XmlDocument не имеет значения int.
источник
Integer.valueOf("123")
если все, что вам нужно, это примитив, вместо этого используйте,Integer.parseInt("123")
потому что метод valueOf вызывает ненужную распаковку.Я думаю, вы задаетесь вопросом, почему C или C ++ позволяют вам манипулировать указателем объекта, как числом, но вы не можете манипулировать ссылкой на объект в Java таким же образом.
Ссылки на объекты в Java не похожи на указатели в C или C ++ ... Указатели в основном являются целыми числами, и вы можете манипулировать ими, как любой другой тип int Ссылки намеренно представляют собой более конкретную абстракцию, и ими нельзя манипулировать так, как это делают указатели.
источник
Этот код показывает, почему
ArrayList
это важно и почему мы его используем. Просто литьеint
изObject
. Может быть, это полезно.источник
Переменная объекта примера;
hastaId
Например приведение объекта к int,
hastaID
источник
Ссылайтесь на этот код:
источник
источник
Наконец, лучшая реализация для вашей спецификации была найдена.
источник
сначала проверьте ключевое слово instanceof. если правда, тогда брось это.
источник