Cách truyền Object vào int


221

Làm thế nào tôi có thể truyền một Object cho một int trong java?


6
Thật sự bạn muốn làm gì? Nếu Objectkhông phải là một Integer, tôi không chắc những gì bạn đang mong đợi từ dàn diễn viên của bạn.
unolysampler

2
kiểm tra đầu tiên với từ khóa instanceof. nếu đúng thì đúc nó.
Lập trình viên chết

À. Tôi chỉ muốn có các thành viên enum truyền tới các giá trị nguyên cụ thể, để tôi có thể có các enum cho các hằng winapi. msdn.microsoft.com/en-us/library/windows/desktop/...
Tomáš Zato - Khôi phục Monica

@ TomášZato Bạn có thể làm điều đó (sắp xếp), chỉ cần xác định một trường trong enum của bạn để giữ giá trị nguyên (giả sử intValue), tạo một hàm tạo cho enum của bạn để đặt intValue, các hằng số enum của bạn gọi hàm tạo đó và thêm một hàm cho intValue. Sau đó, thay vì đúc, hãy gọi getter.
Brian McCutchon

Câu trả lời:


385

Nếu bạn chắc chắn rằng đối tượng này là Integer:

int i = (Integer) object;

Hoặc, bắt đầu từ Java 7, bạn có thể viết tương đương:

int i = (int) object;

Coi chừng, nó có thể ném ClassCastExceptionnếu đối tượng của bạn không phải là IntegerNullPointerExceptionnếu đối tượng của bạn là null.

Bằng cách này, bạn cho rằng Object của bạn là một Integer (int được bao bọc) và bạn mở hộp nó thành int.

intlà một nguyên thủy vì vậy nó không thể được lưu trữ dưới dạng Object, cách duy nhất là intxem xét / đóng hộp dưới dạng Integerlưu trữ dưới dạng Object.


Nếu đối tượng của bạn là a String, thì bạn có thể sử dụng Integer.valueOf()phương thức để chuyển đổi nó thành một int đơn giản:

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

Nó có thể ném NumberFormatExceptionnếu đối tượng của bạn không thực sự là Stringmột số nguyên dưới dạng nội dung.


Tài nguyên :

Cùng chủ đề:


Bạn có chắc chắn về NullPulumException không? Tôi nghĩ rằng một đối tượng null sẽ chỉ mang lại một Integer null ....
Etienne de Martel

7
Ý NullPointerExceptionchí sẽ xảy ra trong quá trình mở hộp Integervàoint
Colin Hebert

Bạn không truyền vào int, không đối tượng nào có thể được chuyển sang int. Bạn thực sự là Integer và sau đó autoboxing đến một int.
Steve Kuo

1
@Steve Kuo, Yep, chính xác những gì tôi đang nói. Đó là lý do tại sao tôi không sử dụng từ "diễn viên".
Colin Hebert

@Etienne: Bạn có thể truyền đối tượng null cho một số nguyên, do đó, nhận được một số nguyên null. Nhưng khi bạn cố gắng trích xuất int từ nó, bạn sẽ nhận được một ngoại lệ con trỏ null. Không có thứ gọi là "null int".
Jay

18

Giả sử đối tượng là một Integerđối tượng, thì bạn có thể làm điều này:

int i = ((Số nguyên) obj) .intValue ();

Nếu đối tượng không phải là một Integerđối tượng, thì bạn phải phát hiện loại và chuyển đổi nó dựa trên loại của nó.


Nếu obj là null, nó sẽ ném NullPulumException.
Colin Hebert

và ClassCastException nếu nó không phải là đối tượng Integer.
Erick Robertson

1
Không cần phải gọi intValuecho autoboxing sẽ gọi nó cho bạn.
OscarRyz

1
intValuerõ ràng hơn nhiều đặc biệt là xem xét sự nhầm lẫn giữa người mới bắt đầu giữa intviệc có thể hoán đổi cho nhau Integer.
Steve Kuo

14

Kịch bản 1: trường hợp đơn giản

Nếu nó đảm bảo rằng đối tượng của bạn là một Integer, đây là cách đơn giản:

int x = (Integer)yourObject;

Kịch bản 2: bất kỳ đối tượng số

Trong Java Integer, Long, BigIntegervv tất cả thực hiện các Numbergiao diện trong đó có một phương thức có tên intValue. Bất kỳ loại tùy chỉnh nào khác có khía cạnh số cũng nên triển khai Number(ví dụ Age implements Number:). Vì vậy, bạn có thể:

int x = ((Number)yourObject).intValue();

Kịch bản 3: phân tích văn bản số

Khi bạn chấp nhận đầu vào của người dùng từ dòng lệnh (hoặc trường văn bản, v.v.), bạn sẽ nhận được dưới dạng a String. Trong trường hợp này, bạn có thể sử dụng Integer.parseInt(String string):

String input = someBuffer.readLine();
int x = Integer.parseInt(input);

Nếu bạn nhận được đầu vào là Object, bạn có thể sử dụng (String)inputhoặc, nếu nó có thể có một loại văn bản khác , input.toString():

int x = Integer.parseInt(input.toString());

Kịch bản 4: băm danh tính

Trong Java không có con trỏ. Tuy nhiên, Objectcó một triển khai mặc định giống như con trỏ hashCode(), được cung cấp trực tiếp qua System.identityHashCode(Object o). Vì vậy, bạn có thể:

int x = System.identityHashCode(yourObject);

Lưu ý rằng đây không phải là một giá trị con trỏ thực sự. Địa chỉ bộ nhớ của các đối tượng có thể được JVM thay đổi trong khi băm nhận dạng của chúng đang giữ. Ngoài ra, hai đối tượng sống có thể có cùng hàm băm.

Bạn cũng có thể sử dụng object.hashCode(), nhưng nó có thể là loại cụ thể.

Kịch bản 5: chỉ mục duy nhất

Trong cùng một trường hợp, bạn cần một chỉ mục duy nhất cho từng đối tượng, muốn tự động tăng các giá trị ID trong bảng cơ sở dữ liệu (và không giống như băm nhận dạng không phải là duy nhất). Một triển khai mẫu đơn giản cho việc này:

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

}

Sử dụng:

ObjectIndexer indexer = new ObjectIndexer();
int x = indexer.indexFor(yourObject);    // 1
int y = indexer.indexFor(new Object());  // 2
int z = indexer.indexFor(yourObject);    // 1

Kịch bản 6: thành viên enum

Trong Java enum, các thành viên không phải là số nguyên mà là các đối tượng đầy đủ tính năng (không giống như C / C ++ chẳng hạn). Có lẽ không bao giờ cần phải chuyển đổi một đối tượng enum thành int, tuy nhiên Java sẽ tự động liên kết một số chỉ mục cho mỗi thành viên enum. Chỉ số này có thể được truy cập thông qua Enum.ordinal(), ví dụ:

enum Foo { BAR, BAZ, QUX }

// ...

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

nhập mô tả hình ảnh ở đây


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

Như bạn có thể thấy, đây không phải là cách làm rất hiệu quả. Bạn chỉ cần chắc chắn về loại đối tượng bạn có. Sau đó chuyển đổi nó thành một cách đúng.


Không phải là @Deprecated (e thay cho a) sao? :) Mặc dù vậy, phương pháp hay, không giả định về loại đối tượng.
extraneon

Nhân tiện, regex của bạn không tính đến radix hex hoặc oct. ToInt là một phương pháp thông minh. Tốt hơn để thử và bắt NumberFormatExcepytion.
extraneon

4

Bạn phải truyền nó tới một Integer (lớp bao bọc của int). Sau đó, bạn có thể sử dụng phương thức intValue () của Integer để lấy int bên trong.


4

Câu trả lời:

int i = ( Integer ) yourObject;

Nếu, đối tượng của bạn là một số nguyên, nó sẽ chạy trơn tru. I E:

Object yourObject = 1;
//  cast here

hoặc là

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

Vân vân.

Nếu đối tượng của bạn là bất cứ điều gì khác, bạn sẽ cần phải chuyển đổi nó (nếu có thể) thành int trước:

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

Hoặc là

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

4

Tôi sử dụng một lớp lót khi xử lý dữ liệu từ GSON:

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

Đó là một quá trình dài. Chỉ cần làm (int) Object thay vì Double.valueOf (object.toString ()). IntValue () . Điều này chỉ hoạt động cho số, đó là những gì chúng ta cần.
Sudhakar Krishnan

1
@SudhakarK: (int) Đối tượng chỉ hoạt động nếu đối tượng của bạn là một số nguyên. Oneliner này cũng hỗ trợ số String; VẬY "332".
Jacob van Lingen

2

Nếu Objectban đầu được khởi tạo là một Integer, thì bạn có thể hạ thấp nó xuống một inttoán tử cast (Subtype).

Object object = new Integer(10);
int i = (Integer) object;

Lưu ý rằng điều này chỉ hoạt động khi bạn đang sử dụng ít nhất Java 1.5 với tính năng autoboxing , nếu không bạn phải khai báo inhư Integerthay vào đó và sau đó gọi intValue()vào nó .

Nhưng nếu ban đầu nó không được tạo ra như vậy Integer, thì bạn không thể thất vọng như thế. Nó sẽ dẫn đến một ClassCastExceptiontên lớp gốc trong tin nhắn. Nếu toString()biểu diễn của đối tượng thu được bằng cách String#valueOf()biểu thị một số nguyên hợp lệ về mặt cú pháp (ví dụ: chỉ các chữ số, nếu cần thiết có dấu trừ ở phía trước), thì bạn có thể sử dụng Integer#valueOf()hoặc new Integer()cho điều này.

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

Xem thêm:


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

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

2

Không thể được thực hiện. An intkhông phải là một đối tượng, nó là một kiểu nguyên thủy. Bạn có thể truyền nó tới Integer, sau đó lấy int.

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

 int num = i; //Java 1.5 or higher

Điều này giả định rằng đối tượng là một số nguyên mà gần như chắc chắn là không. Có lẽ muốn giải pháp chuỗi ala Coronauts
Bill K

Làm thế nào nó có thể biên dịch khi bạn đang truyền một đối tượng vào Object và sau đó cố gắng đặt nó thành một biến Integer.
Carlos

2

Bạn không thể. An intkhông phải là một Object.

Integerlà một Objectmặc dù, nhưng tôi nghi ngờ đó là những gì bạn có ý nghĩa.


Có quyền anh tự động / bỏ hộp từ Java 5.
Bruno

@Bruno: Bạn không thể truyền Object cho int. Bạn có thể truyền một Object cho một Integer và sau đó gán nó cho một int và nó sẽ tự động biến đổi một cách kỳ diệu. Nhưng bạn không thể truyền Object cho int.
Jay

(tiếp theo) Cá nhân, tôi nghĩ mọi người tạo ra rất nhiều mã xấu dựa vào hộp thư tự động. Giống như, tôi đã thấy một tuyên bố vào ngày khác, "Double lượng = (Double.parseDouble (stringAmount)). DoubleValue ();". Đó là, anh ta đã phân tích một Chuỗi để có được một nguyên thủy kép, sau đó thực thi một hàm chống lại điều này, điều này buộc trình biên dịch phải tự động chuyển nó thành một đối tượng Double, nhưng hàm đó là doubleValue trích xuất nguyên hàm kép, sau đó anh ta gán cho Double do đó, buộc một hộp tự động. Tức là anh ta chuyển đổi từ nguyên thủy sang đối tượng sang nguyên thủy sang đối tượng, 3 chuyển đổi.
Jay

@Jay, đã đồng ý về nhận xét đầu tiên (xin lỗi tôi đã không rõ ràng về bản thân mình). Về quá nhiều chuyển đổi, bạn cũng đúng, nhưng tôi có ấn tượng rằng trình biên dịch JIT có thể đối phó với điều đó khá tốt, vì vậy nó không quan trọng lắm trong thực tế (điều đó không nhất thiết phải là lý do cho mã xấu ...)
Bruno

1
@Bruno Thủ thuật tự động của hộp thư đến mức nó có thể mang đến cho bạn NullPulumExceptions bất ngờ.
extraneon

1

Nếu bạn muốn truyền String thành int, hãy sử dụng Integer.valueOf("123").

Mặc dù vậy, bạn không thể sử dụng hầu hết các Đối tượng khác cho int, vì chúng không có giá trị int. Ví dụ: XmlDocument không có giá trị int.


1
Đừng sử dụng Integer.valueOf("123")nếu tất cả những gì bạn cần là nguyên thủy thay vì sử dụng Integer.parseInt("123")phương thức valueOf gây ra việc bỏ hộp không cần thiết.
Kerem Baydoğan

1

Tôi đoán bạn đang tự hỏi tại sao C hoặc C ++ cho phép bạn thao tác một con trỏ đối tượng như một số, nhưng bạn không thể thao tác một tham chiếu đối tượng trong Java theo cùng một cách.

Các tham chiếu đối tượng trong Java không giống như các con trỏ trong C hoặc C ++ ... Các con trỏ về cơ bản các số nguyên và bạn có thể thao tác chúng như bất kỳ int nào khác. Các tài liệu tham khảo có chủ ý là một sự trừu tượng cụ thể hơn và không thể bị thao túng theo cách con trỏ có thể.


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

Mã này cho thấy tại sao ArrayListquan trọng và tại sao chúng ta sử dụng nó. Đơn giản chỉ cần đúc inttừ Object. Có thể là hữu ích của nó.


Vui lòng giải thích câu trả lời của bạn
Gwenc37

1

Ví dụ biến đối tượng; hastaId

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

Ví dụ: Truyền đối tượng cho một int,hastaID

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

0

Tham khảo mã này:

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;

Điều này cho thấy một tình huống mà việc truyền hình được yêu cầu và tôi sẽ thêm lỗi cũng thực sự xuất hiện với tình huống này. Thật khó để một lập trình viên mới tìm ra cách triển khai thực tế nếu không có ví dụ. Tôi hy vọng ví dụ này sẽ giúp họ
Nehal Pawar

0

Cuối cùng, việc thực hiện tốt nhất cho đặc điểm kỹ thuật của bạn đã được tìm thấy.

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

-4

kiểm tra đầu tiên với từ khóa instanceof. nếu đúng thì đúc nó.


Tôi đã sử dụng cái này và bây giờ tôi đang tự hỏi làm thế nào để giải quyết 'Giá trị được đóng hộp không được đóng hộp sau đó được reboxed ngay lập tức' trên dòng đó. (Do kiểm tra spotbugs) vì vậy bây giờ tôi đang tự hỏi làm thế nào để giải quyết nó tốt hơn.
Jasper Lankhorst
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.