Jak rzutować obiekt na int


221

Jak mogę rzucić obiekt na int w java?


6
Co naprawdę chcesz robić? Jeśli Objectnie jest Integer, nie jestem pewien, czego oczekujesz od swojej obsady.
unholysampler

2
najpierw sprawdź za pomocą słowa kluczowego instanceof. jeśli to prawda, rzuć to.
Dead Programmer

Aww. Chciałem po prostu mieć członków enum do rzutowania na określone wartości całkowite, aby móc mieć wyliczenia dla stałych winapi. msdn.microsoft.com/en-us/library/windows/desktop/…
Tomáš Zato - Przywróć Monikę

@ 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ć:

int i = (int) object;

Uwaga, może rzucić, ClassCastExceptionjeśli twój obiekt nie jest, Integeri NullPointerExceptionjeśli twój obiekt jest null.

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ą.


Zasoby :

Na ten sam temat:


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:

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;
        }
    }

}

Stosowanie:

ObjectIndexer indexer = new ObjectIndexer();
int x = indexer.indexFor(yourObject);    // 1
int y = indexer.indexFor(new Object());  // 2
int 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:

enum Foo { BAR, BAZ, QUX }

// ...

Object baz = Foo.BAZ;
int index = ((Enum)baz).ordinal(); // 1

wprowadź opis zdjęcia tutaj


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");
    }
}

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.


4

Odpowiedź:

int i = ( Integer ) yourObject;

Jeśli obiekt jest już liczbą całkowitą, będzie działał płynnie. to znaczy:

Object yourObject = 1;
//  cast here

lub

Object yourObject = new Integer(1);
//  cast here

itp.

Jeśli twoim obiektem jest coś innego, musisz najpierw przekonwertować go (jeśli to możliwe) na int:

String s = "1";
Object yourObject = Integer.parseInt(s);
//  cast here

Lub

String s = "1";
Object yourObject = Integer.valueOf( s );
//  cast here

4

Podczas przetwarzania danych z GSON używam jednowierszowego:

int i = object != null ? Double.valueOf(object.toString()).intValue() : 0;

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 = new Integer(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() .

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));

Zobacz też:


2
int i = (Integer) object; //Type is Integer.

int i = Integer.parseInt((String)object); //Type is String.

2

Nie da się tego zrobić. An intnie jest przedmiotem, jest to prymitywny typ. Możesz rzucić go na Integer, a następnie uzyskać int.

 Integer i = (Integer) o; // throws ClassCastException if o.getClass() != Integer.class

 int num = i; //Java 1.5 or higher

Zakłada się, że obiekt jest liczbą całkowitą, którą prawie na pewno nie jest. Prawdopodobnie chcesz rozwiązanie strunowe ala Coronauts
Bill K

Jak można go skompilować, gdy rzutujesz obiekt na obiekt, a następnie próbujesz ustawić go na zmienną całkowitą.
Carlos

2

Nie możesz An intnie jest Object.

Integerjest Objectjednak, ale wątpię, o to ci chodzi.


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.


1
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.


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

Ten kod pokazuje, dlaczego ArrayListjest ważny i dlaczego go używamy. Po prostu casting intz Object. Może być pomocny.


Wyjaśnij swoją odpowiedź
Gwenc37

1

Na przykład zmienna obiektowa; hastaId

Object hastaId = session.getAttribute("hastaID");

Na przykład Rzuć obiekt na int,hastaID

int hastaID=Integer.parseInt(String.valueOf(hastaId));

0

Odwołaj się do tego kodu:

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;

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.

public int tellMyNumber(Object any) {
    return 42;
}

-4

najpierw sprawdź za pomocą słowa kluczowego instanceof. jeśli to prawda, rzuć to.


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.
Jasper Lankhorst
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.