วิธีการร่าย Object ไปยัง int


221

ฉันจะส่ง Object ไปยัง int ใน java ได้อย่างไร?


6
คุณต้องการทำอะไร ถ้าObjectไม่ใช่Integerฉันไม่แน่ใจว่าคุณคาดหวังอะไรจากนักแสดงของคุณ
unholysampler

2
ตรวจสอบครั้งแรกด้วยคำหลักของอินสแตนซ์ ถ้าเป็นจริงแล้วโยนมัน
โปรแกรมเมอร์ Dead

Aww ฉันแค่อยากให้สมาชิก enum ทำการแปลงค่าจำนวนเต็มเฉพาะเพื่อที่ฉันจะได้ enums สำหรับค่าคงที่ของ winapi msdn.microsoft.com/en-us/library/windows/desktop/ ......
Tomáš Zato - Reinstate Monica

@ TomášZatoคุณสามารถทำได้ (เรียงลำดับ) เพียงกำหนดเขตข้อมูลใน enum ของคุณเพื่อเก็บค่าจำนวนเต็ม (พูดintValue) สร้างตัวสร้างสำหรับ enum ของคุณที่ตั้งค่าให้intValueenum ค่าคงที่ของคุณเรียกใช้ตัวสร้างนั้นและเพิ่ม getter intValueสำหรับ จากนั้นแทนที่จะโทรหาผู้โทรเข้า
Brian McCutchon

คำตอบ:


385

หากคุณแน่ใจว่าวัตถุนี้เป็นInteger:

int i = (Integer) object;

หรือเริ่มจาก Java 7 คุณสามารถเขียน:

int i = (int) object;

ระวังก็สามารถโยนClassCastExceptionถ้าวัตถุของคุณไม่ได้เป็นIntegerและถ้าวัตถุของคุณNullPointerExceptionnull

วิธีนี้คุณคิดว่า Object ของคุณเป็นจำนวนเต็ม (int ที่ล้อมรอบ) และคุณยกเลิกการรวมเป็น int

intเป็นดั้งเดิมจึงไม่สามารถเก็บไว้เป็นObjectเพียงวิธีเดียวคือการมีintการพิจารณา / บรรจุกล่องเป็นเก็บไว้แล้วในฐานะที่เป็นIntegerObject


หากวัตถุของคุณคือStringคุณสามารถใช้Integer.valueOf()วิธีการแปลงเป็น int อย่างง่าย:

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

มันสามารถขว้างNumberFormatExceptionถ้าวัตถุของคุณไม่ได้เป็นStringจำนวนเต็มเป็นเนื้อหา


ทรัพยากร:

ในหัวข้อเดียวกัน:


คุณแน่ใจเกี่ยวกับ NullPointerException หรือไม่ ฉันคิดว่าวัตถุ null จะให้ผลเป็นศูนย์รวมจำนวนเต็ม ....
Etienne de Martel

7
NullPointerExceptionจะเกิดขึ้นในช่วงแกะกล่องของIntegerเข้าint
โคลินเบิร์ต

คุณไม่ได้ร่ายไปยัง int ไม่สามารถโยน Object ไปยัง int ได้ จริงๆแล้วคุณเป็นจำนวนเต็มจากนั้นจึงเปลี่ยนเป็นอัตโนมัติ
Steve Kuo

1
@ Steve Kuo, ใช่แล้วสิ่งที่ฉันพูด นั่นเป็นเหตุผลที่ฉันไม่ได้ใช้คำว่า "นักแสดง"
Colin Hebert

@Etienne: คุณสามารถส่งค่า null Object ไปยัง Integer เพื่อรับค่า Null Integer แต่เมื่อคุณพยายามที่จะสกัด int จากมันคุณจะได้รับข้อยกเว้นตัวชี้โมฆะ ไม่มีสิ่งเช่น "null int"
Jay

18

สมมติว่าวัตถุเป็นIntegerวัตถุจากนั้นคุณสามารถทำสิ่งนี้:

int i = ((จำนวนเต็ม) obj) .intValue ();

หากวัตถุนั้นไม่ใช่Integerวัตถุคุณจะต้องตรวจจับชนิดและแปลงตามประเภทของวัตถุนั้น


ถ้า obj เป็นโมฆะมันจะโยน NullPointerException
Colin Hebert

และ ClassCastException หากไม่ใช่วัตถุจำนวนเต็ม
Erick Robertson

1
ไม่จำเป็นต้องเรียกใช้intValueการ autoboxing จะเรียกใช้สำหรับคุณ
OscarRyz

1
intValueมีความชัดเจนมากขึ้นโดยเฉพาะอย่างยิ่งเมื่อพิจารณาความสับสนระหว่างผู้เริ่มต้นกับintการใช้แทนกันIntegerได้
Steve Kuo

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: ดัชนีที่ไม่ซ้ำ

ในกรณีเดียวกันคุณต้องมีดัชนีที่ไม่ซ้ำกันสำหรับแต่ละวัตถุเช่นการเพิ่มค่า ID อัตโนมัติในตารางฐานข้อมูล (และแตกต่างจากแฮชเอกลักษณ์ที่ไม่ซ้ำกัน) การใช้งานตัวอย่างอย่างง่ายสำหรับสิ่งนี้:

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: สมาชิก enum

ในสมาชิก Java enum ไม่ใช่จำนวนเต็ม แต่เป็นวัตถุเด่นเต็มรูปแบบ (ต่างจาก C / C ++ เป็นต้น) อาจไม่จำเป็นต้องแปลงอ็อบเจกต์ enum เป็นintแต่จาวาจะเชื่อมโยงหมายเลขดัชนีกับสมาชิก 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");
    }
}

อย่างที่คุณเห็นนี่ไม่ใช่วิธีที่มีประสิทธิภาพมากในการทำเช่นนี้ คุณเพียงแค่ต้องแน่ใจว่าคุณมีวัตถุประเภทใด จากนั้นแปลงให้เป็นทางที่ถูกต้อง


มันไม่ @Deprecated (e แทน) :) วิธีที่ดีแม้ว่าไม่มีสมมติฐานบนชนิดของวัตถุ
Extraneon

อย่างไรก็ตาม Regex ของคุณไม่ได้คำนึงถึงเลขฐานสิบหกหรือฐานแปด ToInt เป็นวิธีการอันชาญฉลาด ดีกว่าที่จะลองและจับ NumberFormatExcepytion
Extraneon

4

คุณต้องส่งมันไปที่ Integer (คลาส wrapper ของ int) จากนั้นคุณสามารถใช้เมธอด intValue () ของ Integer เพื่อรับค่าอินทีภายใน


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 นี้ยังรองรับหมายเลข String; EG "332"
Jacob van Lingen

2

หากตอน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()แสดงจำนวนเต็มที่ถูกต้อง syntactically (เช่นตัวเลขเท่านั้นหากจำเป็นต้องมีเครื่องหมายลบหน้า) จากนั้นคุณสามารถใช้Integer#valueOf()หรือnew Integer()สำหรับสิ่งนี้

Object object = "10";
int i = Integer.valueOf(String.valueOf(object));

ดูสิ่งนี้ด้วย:



2

ไม่สามารถทำได้ An intไม่ใช่วัตถุมันเป็นชนิดดั้งเดิม คุณสามารถส่งให้ Integer จากนั้นรับค่าได้

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

 int num = i; //Java 1.5 or higher

นี่ถือว่าเป็นวัตถุที่เป็นจำนวนเต็มซึ่งมันเกือบจะไม่แน่นอน อาจต้องการโซลูชันสตริง ala Coronauts
Bill K

มันจะรวบรวมเมื่อคุณส่งวัตถุเป็นวัตถุแล้วพยายามตั้งเป็นตัวแปรจำนวนเต็ม
Carlos

2

คุณทำไม่ได้ ไม่ได้เป็นintObject

Integerเป็นObjectแต่ฉันสงสัยว่าเป็นสิ่งที่คุณหมายถึง


มี auto Boxing / unboxing ตั้งแต่ Java 5
Bruno

@Bruno: คุณไม่สามารถส่ง Object ไปยัง int ได้ คุณสามารถส่ง Object ไปยัง Integer ได้จากนั้นกำหนดมันให้กับ int และมันจะทำการ autounbox อย่างน่าอัศจรรย์ แต่คุณไม่สามารถส่ง Object ไปยัง int
Jay

(ต่อ) โดยส่วนตัวแล้วฉันคิดว่าผู้คนสร้างรหัสที่ไม่ดีจำนวนมากโดยอาศัยการล็อกอัตโนมัติ เช่นฉันเห็นคำสั่งในวันอื่น ๆ "Double amount = (Double.parseDouble (stringAmount)) doubleValue ();" นั่นคือเขาแยกวิเคราะห์ String เพื่อให้ได้ค่าดั้งเดิมสองเท่าจากนั้นเรียกใช้ฟังก์ชันกับสิ่งนี้ซึ่งบังคับให้คอมไพเลอร์ทำการ autobox ลงในวัตถุ Double แต่ฟังก์ชันนั้นเป็น doubleValue ซึ่งแยก double ดั้งเดิมซึ่งเขาได้มอบหมายให้ Double วัตถุจึงบังคับให้ autobox นั่นคือเขาแปลงจากแบบดั้งเดิมเป็นแบบวัตถุเป็นแบบดั้งเดิมเป็นแบบ 3 แบบ
Jay

@ เจเห็นด้วยกับความคิดเห็นที่ 1 (ขอโทษฉันไม่ได้ล้างตัวเอง) เกี่ยวกับการแปลงมากเกินไปคุณพูดถูก แต่ฉันรู้สึกว่าคอมไพเลอร์ JIT สามารถรับมือกับมันได้ค่อนข้างดีดังนั้นมันจึงไม่สำคัญว่าในทางปฏิบัติมาก (ซึ่งไม่จำเป็นต้องเป็นข้อแก้ตัวสำหรับโค้ดที่ไม่ดี) ... )
Bruno

1
@Bruno เคล็ดลับของการ autobox เป็นส่วนหนึ่งที่ทำให้ NullPointerExceptions ไม่คาดคิด
Extraneon

1

ถ้าคุณหมายถึงโยนเชือกเพื่อ int Integer.valueOf("123")ที่ใช้

คุณไม่สามารถใช้ออบเจ็กต์อื่น ๆ ส่วนใหญ่เพื่อ int ได้เนื่องจากพวกเขาจะไม่มีค่า int เช่น XmlDocument ไม่มีค่า int


1
อย่าใช้Integer.valueOf("123")ถ้าทุกอย่างที่คุณต้องการนั้นเป็นแบบดั้งเดิมแทนที่จะใช้Integer.parseInt("123")เพราะเมธอดvalueOfทำให้การUnboxไม่จำเป็น
Kerem Baydoğan

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

ยกตัวอย่างเช่นโยนวัตถุไปยัง inthastaID

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;

นี่แสดงสถานการณ์ที่จำเป็นต้องมีการคัดเลือกนักแสดงและฉันจะเพิ่มข้อผิดพลาดเช่นกันซึ่งแสดงให้เห็นถึงสถานการณ์นี้จริง ๆ มันยากสำหรับ coder ใหม่ที่จะคิดออกการใช้งานจริงหากไม่มีตัวอย่าง ฉันหวังว่าตัวอย่างนี้จะช่วยพวกเขา
Nehal Pawar

0

ในที่สุดการใช้งานที่ดีที่สุดสำหรับข้อกำหนดของคุณก็พบว่า

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

-4

ตรวจสอบครั้งแรกด้วยคำหลักของอินสแตนซ์ ถ้าเป็นจริงแล้วโยนมัน


ฉันใช้สิ่งนี้และตอนนี้ฉันสงสัยว่าจะแก้ 'กล่องที่มีค่าแล้ว (เนื่องจากการตรวจสอบสปอตบั๊ก) ดังนั้นตอนนี้ฉันสงสัยว่าจะแก้ปัญหาได้ดีกว่า
Jasper Lankhorst
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.