2013-06-14 41 views
6

Thực hiện một chồng chung, các thành ngữ sau đây được sử dụng và hoạt động mà không có vấn đề gìđúc Object [] để một kiểu tham chiếu mảng trong java

public class GenericStack<Item> { 
    private int N; 
    private Item[] data;  

    public GenericStack(int sz) { 
     super(); 
     data = (Item[]) new Object[sz]; 

    } 
     ... 
} 

Tuy nhiên khi tôi thử những điều sau đây, nó gây ra một ClassCastException

String[] stra = (String[]) new Object[4]; 

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String; 

Bạn giải thích điều này như thế nào?

+0

Chuỗi không được kế thừa từ Mục, do đó, không thể truyền. – Piovezan

+1

@Piovezan 'Chuỗi' và' Mục' không nằm trong cùng một dòng. – Dukeling

+0

'mới GenericStack (10)' hoạt động nhưng nếu bạn thử 'Chuỗi [] stra = new GenericStack (10).getData(); '(thực hiện getter tương ứng), nó không thành công với ClassCastException. Vì vậy, nó không "thực sự" làm việc, dàn diễn viên đã không được thực hiện kỳ ​​diệu. –

Trả lời

3

Đúc một new Object[4] đến một String[] không làm việc vì một Object[] không phải là một String[], giống như một Object không phải là một String.

Ví dụ đầu tiên hoạt động vì type erasure. Khi chạy, tham số kiểu Item đã bị xóa thành Object. Tuy nhiên nó tương tự sẽ thất bại nếu bạn đã cố gắng để gán mảng tới một loại reifiable, ví dụ nếu data không private:

String[] strings = new GenericStack<String>(42).data; 

này sẽ tương tự như ném một ClassCastException, bởi vì những gì là thực sự là một Object[] sẽ được đúc để String[].

0

Tôi nghĩ rằng đây là câu trả lời tốt nhất cho câu hỏi này:

"Một String [] không phải là một Object [], đó là một chút phản trực giác Bạn đang gặp phải những" Banana is-a quả "nhưng một danh sách" Danh sách chuối không phải là một danh sách trái cây "."

Ref: https://stackoverflow.com/a/1018774/847818

Từ cùng một câu hỏi, làm thế nào để cast:

String[] stringArray = Arrays.copyOf(objectArray, objectArray.length, String[].class); 

hoặc

String[] stringArray = Arrays.asList(objectArray).toArray(new String[objectArray.length]); 
+2

Hành động chính xác ở đây có thể chỉ đơn giản là một nhận xét về câu hỏi có nội dung "[Có thể trùng lặp] (http: // stackoverflow. com/questions/1018750/how-to-convert-object-mảng-thành-chuỗi-mảng-trong-java) ". – Dukeling

+0

Có thể, nhưng cá nhân nếu câu trả lời không thực sự giống nhau, tôi sẽ chờ phản hồi từ OP. Có lẽ anh ta sẽ yêu cầu một cái gì đó nhiều hơn và khác nhau. :) – Enrichman

+0

cảm ơn @Enrichman cho liên kết, tôi đã nhận mã ngăn xếp chung từ cuốn sách algo của sedgewick .. liên kết của bạn đã giúp tôi hiểu nó tốt hơn – damon

2

Do Generics chô bôi loại mục mảng trở thành đối tượng mảng effectivelly. Do đó hãy nhập các kết quả phù hợp. Nhưng khi bạn làm điều đó với kiểu chuỗi cụ thể thì nó không. Không có loại tẩy xóa nào được áp dụng và không thành công.

1

Tôi nghĩ nếu tham chiếu lớp Object trỏ đến bất kỳ đối tượng lớp con nào như lớp String hoặc bất kỳ lớp nào khác thì chúng ta chỉ có thể đưa tham chiếu lớp đối tượng đến lớp cụ thể đó (đối tượng chúng ta đã tạo và gán cho lớp Object ref) và chỉ định một tham chiếu đến nó. và nếu chúng ta tạo một đối tượng trực tiếp của lớp Object (như bạn đã đề cập) sẽ không hoạt động.

Ví dụ:

Object[] obj = new String[4]; 
String[] stra = (String[]) obj; 

trên mã sẽ không tạo ra bất kỳ ClassCastException.

Hope this helps