2013-04-11 52 views
5
public static void main(String[] args) throws Exception { 
    int[] a = new int[] { 1, 2, 3 }; 
    method(a); 
} 

public static void method(Object o) { 
    if (o != null && o.getClass().isArray()) { 
     Object[] a = (Object[]) o; 
     // java.lang.ClassCastException: [I cannot be cast to [Ljava.lang.Object; 
    } 
} 

Tôi không được biết loại tham số o trong method là gì. Làm thế nào tôi có thể đúc nó trong một mảng Object[]?Truyền một đối tượng đến một mảng

instanceof không thể là giải pháp vì tham số có thể là một mảng thuộc bất kỳ loại nào.

PS: Tôi đã xem một số câu hỏi về SO đối phó với việc truyền mảng, nhưng không có ai (chưa?) Nơi bạn không biết loại mảng. .

+0

Bạn có thể cung cấp thêm một chút ngữ cảnh cho câu hỏi của mình không. Bạn định làm gì với những vật thể này? –

Trả lời

6

Bạn có thể sử dụng java.lang.reflect.Array.get() để lấy yếu tố cụ thể từ mảng không xác định của mình.

+2

+1 và 'Array.getLength()' để có chiều dài. –

+1

Điều này sẽ hoạt động rất chậm do phản ánh. Nhưng +1 cho một ý tưởng – Andremoniy

+1

Nhìn vào các thẻ, tôi nghĩ rằng đó là một phần những gì anh ta đang tìm kiếm – SGM1

3

Lựa chọn 1

Sử dụng o.getClass() getComponentType() để xác định loại là nó:

if (o != null) { 
    Class ofArray = o.getClass().getComponentType(); // returns int 
} 

Xem Demo


Tùy chọn 2

if (o instanceof int[]) { 
    int[] a = (int[]) o;   
} 

* Noice: Bạn có thể sử dụng bất kỳ loại nào khác ngoài int để xác định loại mảng đó và truyền đến khi cần.

+0

+1 'o! = Null' là dư thừa –

+0

@PeterLawrey cảm ơn bạn đã sửa nó. – CloudyMarble

+0

IMHO đây là câu trả lời tốt nhất, đó là câu hỏi không chính xác giả định rằng nó cần phải được đúc một 'Object []' –

4

Bạn không thể truyền đối tượng này lên lớp Object[] vì thực tế đây là một mảng int -s. Vì vậy, nó sẽ được chính xác nếu bạn viết:

public static void method(Object o) { 
    if (o instanceof int[]) { 
     int[] a = (int[]) o; 
     // .... 
    } 
} 
+0

Tôi sau đó nên viết càng nhiều 'if' như thoát khỏi các kiểu nguyên thủy? – sp00m

+1

@ sp00m, vâng, bạn nên làm như vậy. Và nó không phải là một cái gì đó sai trái. Nhìn vào lớp 'java.util.Arrays' và bạn sẽ thấy, đây là một mẫu chung cho các kiểu nguyên thủy. Ví dụ, xem phương thức 'hashCode' của lớp' java.util.Arrays'. – Andremoniy

+1

Điều này (và các câu trả lời tương tự khác) có vẻ phù hợp nhất với tôi. Trong khi nó cảm thấy * sai * để đóng gói một phương thức với câu lệnh 'if', nó thực sự cần thiết nếu bạn phải lấy một' Object' làm đầu vào của bạn. –

5

Bạn không thể cast một loạt các nguyên thủy (int s trong trường hợp của bạn) để một mảng của Object s. Nếu bạn thay đổi:

int[] a = new int[] { 1, 2, 3 }; 

để

Integer[] a = new Integer[] { 1, 2, 3 }; 

cần làm việc.

+1

Nếu bạn không bao giờ vượt qua nguyên thủy, bạn sẽ luôn có thể truyền tới 'Object' và vấn đề của bạn sẽ được giải quyết – iberbeu

+0

Đây là việc sử dụng không chính xác các trình bao bọc đối tượng trong mảng. Làm như vậy bạn tạo ra chi phí trên bộ nhớ. – Andremoniy

Các vấn đề liên quan