@ TomášZato Możesz to zrobić (w pewnym sensie), po prostu zdefiniuj pole w twoim wyliczeniu, aby utrzymać wartość całkowitą (powiedzmy intValue), utwórz konstruktor dla twojego wyliczenia, który ustawi intValue, niech twoje stałe wyliczeniowe będą wywoływały tego konstruktora i dodaj getter dla intValue. Następnie zamiast rzucać, zadzwoń do pobierającego.
Brian McCutchon
Odpowiedzi:
385
Jeśli masz pewność, że ten obiekt to Integer:
int i =(Integer) object;
Lub, począwszy od Java 7, możesz w równoważny sposób napisać:
W ten sposób zakładasz, że Twój obiekt jest liczbą całkowitą (zawiniętą liczbą całkowitą) i rozpakowujesz go na liczbę całkowitą.
intjest prymitywny, więc nie może być przechowywany jako Object, jedynym sposobem jest introzważenie / umieszczenie go w pudełku jako Integerwtedy Object.
Jeśli Twoim obiektem jest a String, możesz użyć Integer.valueOf()metody do przekonwertowania go na prosty int:
int i =Integer.valueOf((String) object);
Może rzucić a, NumberFormatExceptionjeśli Twój obiekt nie jest tak naprawdę Stringliczbą całkowitą jako treścią.
Czy jesteś pewien NullPointerException? Myślałem, że zerowy obiekt po prostu da zerową liczbę całkowitą ....
Etienne de Martel,
7
NullPointerExceptionWystąpią podczas unboxing od Integerdoint
Colin Hebert
Nie rzucasz na int, żaden obiekt nie może być nigdy rzutowany na int. Jesteś w rzeczywistości na Integer, a następnie autoboxujesz na int.
Steve Kuo,
1
@ Steve Kuo, tak, dokładnie to, co mówię. Dlatego nie użyłem słowa „obsada”.
Colin Hebert
@Etienne: Możesz rzucić zerowy obiekt na liczbę całkowitą, uzyskując w ten sposób zerową liczbę całkowitą. Ale gdy spróbujesz wyodrębnić z niego wartość int, otrzymasz wyjątek wskaźnika zerowego. Nie ma czegoś takiego jak „null int”.
Jay
18
Zakładając, że obiekt jest Integerobiektem, możesz to zrobić:
int i = ((liczba całkowita) obj) .intValue ();
Jeśli obiekt nie jest Integerobiektem, musisz wykryć typ i przekonwertować go na podstawie jego typu.
Jeśli obj ma wartość NULL, wygeneruje wyjątek NullPointerException.
Colin Hebert
oraz ClassCastException, jeśli nie jest to obiekt typu Integer.
Erick Robertson,
1
Nie trzeba wywoływać intValuedla autoboxingu, wywoła to dla ciebie.
OscarRyz
1
intValuejest o wiele jaśniejszy, szczególnie biorąc pod uwagę zamieszanie początkującego pomiędzy intbyciem wymiennym Integer.
Steve Kuo,
14
Scenariusz 1: prosty przypadek
Jeśli masz pewność, że twój obiekt jest Integer, to jest to prosty sposób:
int x =(Integer)yourObject;
Scenariusz 2: dowolny obiekt numeryczny
W Javie Integer, Long, BigIntegeritd. Wszystko zaimplementować Numberinterfejs, który ma metodę nazwie intValue. Wszelkie inne niestandardowe typy o aspekcie liczbowym również powinny implementować Number(na przykład Age implements Number:). Więc możesz:
int x =((Number)yourObject).intValue();
Scenariusz 3: parsowanie tekstu numerycznego
Gdy zaakceptujesz dane wprowadzone z linii poleceń (lub pola tekstowego itp.), Otrzymasz je jako String. W takim przypadku możesz użyć Integer.parseInt(String string):
String input = someBuffer.readLine();int x =Integer.parseInt(input);
Jeśli otrzymasz dane wejściowe jako Object, możesz użyć (String)inputlub, jeśli może mieć inny typ tekstu input.toString():
int x =Integer.parseInt(input.toString());
Scenariusz 4: skrót tożsamości
W Javie nie ma wskaźników. ObjectMa jednak domyślną implementację przypominającą wskaźnik dla hashCode(), która jest bezpośrednio dostępna za pośrednictwem System.identityHashCode(Object o). Więc możesz:
int x =System.identityHashCode(yourObject);
Zauważ, że to nie jest prawdziwa wartość wskaźnika. Adres pamięci obiektów może być zmieniany przez JVM, podczas gdy utrzymywane są skróty tożsamości. Ponadto dwa żywe obiekty mogą mieć ten sam skrót tożsamości.
Możesz także użyć object.hashCode(), ale może on być specyficzny dla typu.
Scenariusz 5: unikalny indeks
W tych samych przypadkach potrzebny jest unikalny indeks dla każdego obiektu, na przykład automatyczne zwiększenie wartości identyfikatora w tabeli bazy danych (w przeciwieństwie do skrótu tożsamości, który nie jest unikalny). Prosta przykładowa implementacja do tego:
ObjectIndexer indexer =newObjectIndexer();int x = indexer.indexFor(yourObject);// 1int y = indexer.indexFor(newObject());// 2int z = indexer.indexFor(yourObject);// 1
Scenariusz 6: członek enum
W Java enum członkowie nie są liczbami całkowitymi, ale pełnymi obiektami (na przykład w przeciwieństwie do C / C ++). Prawdopodobnie nigdy nie ma potrzeby konwertowania obiektu wyliczeniowego int, jednak Java automatycznie przypisuje numer indeksu do każdego elementu wyliczeniowego. Dostęp do tego indeksu można uzyskać Enum.ordinal()na przykład:
enumFoo{ BAR, BAZ, QUX }// ...Object baz =Foo.BAZ;int index =((Enum)baz).ordinal();// 1
Jak widać, nie jest to zbyt wydajny sposób na zrobienie tego. Musisz po prostu mieć pewność, jaki rodzaj przedmiotu posiadasz. Następnie przekonwertuj go na int we właściwy sposób.
Czy to nie @Deprecated (e zamiast a)? :) Jednak fajna metoda, nie przyjmuje żadnych założeń co do rodzaju obiektu.
extraneon
Nawiasem mówiąc, twoje wyrażenie regularne nie bierze pod uwagę liczby szesnastkowej ani ósemkowej. ToInt to inteligentna metoda. Bettere, aby spróbować złapać NumberFormatExcepytion.
extraneon
4
Musisz rzucić go na liczbę całkowitą (klasa otoki int). Następnie można użyć metody intValue () Integer, aby uzyskać wartość int.
To długi proces. Po prostu wykonaj (int) Object zamiast Double.valueOf (object.toString ()). IntValue () . Działa to tylko dla liczb, właśnie tego potrzebowaliśmy.
Sudhakar Krishnan
1
@SudhakarK: (int) Obiekt działa tylko wtedy, gdy twój obiekt jest liczbą całkowitą. Ten oneliner obsługuje także numery ciągów; EG „332”.
Jacob van Lingen
2
Jeśli Objectinstancja została pierwotnie utworzona jako Integer, to możesz sprowadzić ją do intużywającego operatora rzutowania (Subtype).
Object object =newInteger(10);int i =(Integer) object;
Zauważ, że działa to tylko wtedy, gdy używasz przynajmniej Java 1.5 z funkcją autoboxowania , w przeciwnym razie musisz zadeklarować ijako, Integera następnie wywołać intValue()ją .
Ale jeśli początkowo nie został w ogóle stworzony Integer, to nie możesz tak spuszczać. Oznaczałoby to, ClassCastExceptionże wiadomość zawiera oryginalną nazwę klasy. Jeśli reprezentacja obiektu toString()uzyskana za pomocą String#valueOf()oznacza poprawną składniowo liczbę całkowitą (np. Tylko cyfry, w razie potrzeby ze znakiem minus), możesz użyć Integer#valueOf()lub new Integer()do tego.
Object object ="10";int i =Integer.valueOf(String.valueOf(object));
Istnieje automatyczne boksowanie / rozpakowywanie od Java 5.
Bruno
@Bruno: Nie możesz rzucić Object na int. Możesz rzucić obiekt na liczbę całkowitą, a następnie przypisać go do liczby całkowitej, a magicznie automatycznie się wyskoczy. Ale nie możesz rzucić Object na int.
Jay
(ciąg dalszy) Osobiście uważam, że ludzie tworzą dużo złego kodu, opierając się na autoboxowaniu. Na przykład widziałem kiedyś zdanie: „Podwójna kwota = (Double.parseDouble (stringAmount)). DoubleValue ();”. Oznacza to, że przeanalizował ciąg znaków, aby uzyskać podwójną operację podstawową, a następnie wykonał przeciwko temu funkcję, co zmusiło kompilator do jej automatycznego przekształcenia w obiekt Double, ale funkcją była doubleValue, która wyodrębniła podwójną operację pierwotną, którą następnie przypisał do Double obiekt wymuszając w ten sposób autobox. Oznacza to, że przekształcił się z prymitywnego w obiekt w prymitywny w obiekt, 3 konwersje.
Jay
@Jay, zgodził się na pierwszy komentarz (przepraszam, że się nie wyraziłem). Jeśli chodzi o zbyt wiele konwersji, masz rację, ale mam wrażenie, że kompilator JIT radzi sobie z tym całkiem dobrze, więc nie powinno to mieć większego znaczenia w praktyce (niekoniecznie czyni to pretekstem do złego kodu ...)
Bruno,
1
@Bruno Sztuczka polegająca na autoboksowaniu, która może dać nieoczekiwane wyjątki NullPointerExceptions.
extraneon
1
Jeśli masz na myśli rzutowanie ciągu na int, użyj Integer.valueOf("123").
Nie możesz jednak rzucić większości obiektów na int, ponieważ nie będą one miały wartości int. Np. XmlDocument nie ma wartości int.
Nie używaj Integer.valueOf("123") jeśli wszystko, czego potrzebujesz, to prymitywne, zamiast tego użyj, Integer.parseInt("123")ponieważ metoda valueOf powoduje niepotrzebne rozpakowywanie.
Kerem Baydoğan
1
Chyba zastanawiasz się, dlaczego C lub C ++ pozwala manipulować wskaźnikiem obiektu jak liczbą, ale nie możesz manipulować odwołaniem do obiektu w Javie w ten sam sposób.
Odwołania do obiektów w Javie nie są jak wskaźniki w C lub C ++ ... Wskaźniki są w zasadzie liczbami całkowitymi i można nimi manipulować jak każdą inną int. Odniesienia są celowo bardziej konkretną abstrakcją i nie można nimi manipulować w sposób, w jaki mogą wskazywać wskaźniki.
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
Ten kod pokazuje, dlaczego ArrayListjest ważny i dlaczego go używamy. Po prostu casting intz Object. Może być pomocny.
To pokazuje sytuację, w której wymagany jest rzutowanie i dodam również błąd, który faktycznie pojawia się w tej sytuacji. Nowym programistom trudno jest zorientować się, jaka jest rzeczywista implementacja, jeśli nie ma takiego przykładu. Mam nadzieję, że ten przykład im pomoże
Nehal Pawar
0
Wreszcie znaleziono najlepszą implementację dla Twojej specyfikacji.
Użyłem tego i teraz zastanawiam się, jak rozwiązać „Wartość w pudełku jest rozpakowywana, a następnie natychmiast ponownie w pudełku”. (Z powodu czeków na błędy), więc teraz zastanawiam się, jak to rozwiązać lepiej.
Object
nie jestInteger
, nie jestem pewien, czego oczekujesz od swojej obsady.intValue
), utwórz konstruktor dla twojego wyliczenia, który ustawiintValue
, niech twoje stałe wyliczeniowe będą wywoływały tego konstruktora i dodaj getter dlaintValue
. Następnie zamiast rzucać, zadzwoń do pobierającego.Odpowiedzi:
Jeśli masz pewność, że ten obiekt to
Integer
:Lub, począwszy od Java 7, możesz w równoważny sposób napisać:
Uwaga, może rzucić,
ClassCastException
jeśli twój obiekt nie jest,Integer
iNullPointerException
jeśli twój obiekt jestnull
.W ten sposób zakładasz, że Twój obiekt jest liczbą całkowitą (zawiniętą liczbą całkowitą) i rozpakowujesz go na liczbę całkowitą.
int
jest prymitywny, więc nie może być przechowywany jakoObject
, jedynym sposobem jestint
rozważenie / umieszczenie go w pudełku jakoInteger
wtedyObject
.Jeśli Twoim obiektem jest a
String
, możesz użyćInteger.valueOf()
metody do przekonwertowania go na prosty int:Może rzucić a,
NumberFormatException
jeśli Twój obiekt nie jest tak naprawdęString
liczbą całkowitą jako treścią.Zasoby :
Na ten sam temat:
źródło
NullPointerException
Wystąpią podczas unboxing odInteger
doint
Zakładając, że obiekt jest
Integer
obiektem, możesz to zrobić:Jeśli obiekt nie jest
Integer
obiektem, musisz wykryć typ i przekonwertować go na podstawie jego typu.źródło
intValue
dla autoboxingu, wywoła to dla ciebie.intValue
jest o wiele jaśniejszy, szczególnie biorąc pod uwagę zamieszanie początkującego pomiędzyint
byciem wymiennymInteger
.Scenariusz 1: prosty przypadek
Jeśli masz pewność, że twój obiekt jest
Integer
, to jest to prosty sposób:Scenariusz 2: dowolny obiekt numeryczny
W Javie
Integer
,Long
,BigInteger
itd. Wszystko zaimplementowaćNumber
interfejs, który ma metodę nazwieintValue
. Wszelkie inne niestandardowe typy o aspekcie liczbowym również powinny implementowaćNumber
(na przykładAge implements Number
:). Więc możesz:Scenariusz 3: parsowanie tekstu numerycznego
Gdy zaakceptujesz dane wprowadzone z linii poleceń (lub pola tekstowego itp.), Otrzymasz je jako
String
. W takim przypadku możesz użyćInteger.parseInt(String string)
:Jeśli otrzymasz dane wejściowe jako
Object
, możesz użyć(String)input
lub, jeśli może mieć inny typ tekstuinput.toString()
:Scenariusz 4: skrót tożsamości
W Javie nie ma wskaźników.
Object
Ma jednak domyślną implementację przypominającą wskaźnik dlahashCode()
, która jest bezpośrednio dostępna za pośrednictwemSystem.identityHashCode(Object o)
. Więc możesz:Zauważ, że to nie jest prawdziwa wartość wskaźnika. Adres pamięci obiektów może być zmieniany przez JVM, podczas gdy utrzymywane są skróty tożsamości. Ponadto dwa żywe obiekty mogą mieć ten sam skrót tożsamości.
Możesz także użyć
object.hashCode()
, ale może on być specyficzny dla typu.Scenariusz 5: unikalny indeks
W tych samych przypadkach potrzebny jest unikalny indeks dla każdego obiektu, na przykład automatyczne zwiększenie wartości identyfikatora w tabeli bazy danych (w przeciwieństwie do skrótu tożsamości, który nie jest unikalny). Prosta przykładowa implementacja do tego:
Stosowanie:
Scenariusz 6: członek enum
W Java enum członkowie nie są liczbami całkowitymi, ale pełnymi obiektami (na przykład w przeciwieństwie do C / C ++). Prawdopodobnie nigdy nie ma potrzeby konwertowania obiektu wyliczeniowego
int
, jednak Java automatycznie przypisuje numer indeksu do każdego elementu wyliczeniowego. Dostęp do tego indeksu można uzyskaćEnum.ordinal()
na przykład:źródło
Jak widać, nie jest to zbyt wydajny sposób na zrobienie tego. Musisz po prostu mieć pewność, jaki rodzaj przedmiotu posiadasz. Następnie przekonwertuj go na int we właściwy sposób.
źródło
Musisz rzucić go na liczbę całkowitą (klasa otoki int). Następnie można użyć metody intValue () Integer, aby uzyskać wartość int.
źródło
Odpowiedź:
Jeśli obiekt jest już liczbą całkowitą, będzie działał płynnie. to znaczy:
lub
itp.
Jeśli twoim obiektem jest coś innego, musisz najpierw przekonwertować go (jeśli to możliwe) na int:
Lub
źródło
Podczas przetwarzania danych z GSON używam jednowierszowego:
źródło
Jeśli
Object
instancja została pierwotnie utworzona jakoInteger
, to możesz sprowadzić ją doint
używającego operatora rzutowania(Subtype)
.Zauważ, że działa to tylko wtedy, gdy używasz przynajmniej Java 1.5 z funkcją autoboxowania , w przeciwnym razie musisz zadeklarować
i
jako,Integer
a następnie wywołaćintValue()
ją .Ale jeśli początkowo nie został w ogóle stworzony
Integer
, to nie możesz tak spuszczać. Oznaczałoby to,ClassCastException
że wiadomość zawiera oryginalną nazwę klasy. Jeśli reprezentacja obiektutoString()
uzyskana za pomocąString#valueOf()
oznacza poprawną składniowo liczbę całkowitą (np. Tylko cyfry, w razie potrzeby ze znakiem minus), możesz użyćInteger#valueOf()
lubnew Integer()
do tego.Zobacz też:
źródło
źródło
Nie da się tego zrobić. An
int
nie jest przedmiotem, jest to prymitywny typ. Możesz rzucić go na Integer, a następnie uzyskać int.źródło
Nie możesz An
int
nie jestObject
.Integer
jestObject
jednak, ale wątpię, o to ci chodzi.źródło
Jeśli masz na myśli rzutowanie ciągu na int, użyj
Integer.valueOf("123")
.Nie możesz jednak rzucić większości obiektów na int, ponieważ nie będą one miały wartości int. Np. XmlDocument nie ma wartości int.
źródło
Integer.valueOf("123")
jeśli wszystko, czego potrzebujesz, to prymitywne, zamiast tego użyj,Integer.parseInt("123")
ponieważ metoda valueOf powoduje niepotrzebne rozpakowywanie.Chyba zastanawiasz się, dlaczego C lub C ++ pozwala manipulować wskaźnikiem obiektu jak liczbą, ale nie możesz manipulować odwołaniem do obiektu w Javie w ten sam sposób.
Odwołania do obiektów w Javie nie są jak wskaźniki w C lub C ++ ... Wskaźniki są w zasadzie liczbami całkowitymi i można nimi manipulować jak każdą inną int. Odniesienia są celowo bardziej konkretną abstrakcją i nie można nimi manipulować w sposób, w jaki mogą wskazywać wskaźniki.
źródło
Ten kod pokazuje, dlaczego
ArrayList
jest ważny i dlaczego go używamy. Po prostu castingint
zObject
. Może być pomocny.źródło
Na przykład zmienna obiektowa;
hastaId
Na przykład Rzuć obiekt na int,
hastaID
źródło
Odwołaj się do tego kodu:
źródło
źródło
Wreszcie znaleziono najlepszą implementację dla Twojej specyfikacji.
źródło
najpierw sprawdź za pomocą słowa kluczowego instanceof. jeśli to prawda, rzuć to.
źródło