2013-08-24 42 views
5

sự khác biệt giữa những điều khoản sau đây là gì:chuyển đổi của mảng với generics

List<E>[] x = (List<E>[]) new List[100]; 

List<E>[] x = new List[100]; 

Trong kịch bản của tôi nó lưu ý rằng các cựu sẽ là một cách chính xác để tạo ra một loạt các Generics (mặc dù nó dẫn đến một cảnh báo trình biên dịch). Nhưng tôi hoàn toàn không thể hiểu được việc sử dụng câu lệnh (List<E>[]) là gì. List<E>[] thậm chí không loại riêng của nó, và trình biên dịch sẽ chỉ đơn giản là thay thế nó với (List[]), vì vậy bạn sẽ nhận được

List<E>[] x = (List[]) new List[100]; 

chuyển đổi List[]-List[], đó là vô ích. Vậy tại sao lại đặt một số (List<E>[]) ngay từ đầu?

+1

Mã này có phải là java không? – 6502

+1

Quan tâm đến ngôn ngữ. – Malwaregeek

+0

Xin lỗi, Câu hỏi đã được chỉnh sửa. Không biết về phần giao diện, tôi chỉ sao chép nó ra khỏi kịch bản của tôi, vì vậy tôi cho rằng đó là mã hợp lệ. – user2440792

Trả lời

3

Generics bổ sung tính ổn định cho mã của bạn bằng cách phát hiện nhiều lỗi hơn trong thời gian biên dịch.

Đây là một phần từ liên kết mà tôi đã đưa ra, nghĩ rằng là quan trọng, vì vậy tôi đang đăng đó ở đây

Đây là một đoạn trích nhỏ từ các định nghĩa của các giao diện Danh sách và Iterator trong gói java.util:

public interface List <E> { 
    void add(E x); 
    Iterator<E> iterator(); 
} 

public interface Iterator<E> { 
    E next(); 
    boolean hasNext(); 
} 

mã này nên tất cả được làm quen, ngoại trừ những thứ ở góc Brack ets. Đó là các khai báo của formal type parameters của Danh sách giao diện và Iterator.

Các thông số loại có thể được sử dụng trong suốt quá trình khai báo chung, khá nhiều nơi bạn sẽ sử dụng các loại thông thường.

Chúng tôi biết các lời gọi của danh sách khai báo loại chung, chẳng hạn như Danh sách. Trong lời gọi (thường được gọi là tham số loại), tất cả các lần xuất hiện của tham số kiểu chính thức (E trong trường hợp này) được thay thế bằng đối số kiểu thực tế (trong trường hợp này là Số nguyên).

Bạn có thể tưởng tượng Danh sách mà đứng cho một phiên bản của Danh sách trong đó E đã được thay thế thống nhất bởi Integer:

public interface IntegerList { 
     void add(Integer x); 
     Iterator<Integer> iterator(); 
    } 

trực giác này có thể hữu ích, nhưng nó cũng gây hiểu lầm.

Điều này rất hữu ích, vì loại tham số Danh sách thực hiện thực sự có các phương thức trông giống như mở rộng này.

Điều này gây hiểu lầm, bởi vì việc khai báo chung là không bao giờ thực sự được mở rộng theo cách này. Không có nhiều bản sao của mã - không phải mã nguồn, không phải mã nhị phân, không phải trên đĩa và không có trong bộ nhớ.

Một khai báo kiểu generic được biên dịch một lần và cho tất cả, và quay vào một tập tin lớp duy nhất, giống như một lớp học bình thường hoặc giao diện khai.

Các thông số loại tương tự với các tham số thông thường được sử dụng trong các phương thức hoặc hàm tạo. Giống như một phương thức có giá trị chính thức là các tham số mô tả các loại giá trị mà nó hoạt động, một khai báo chung có các tham số kiểu chính thức. Khi một phương thức được gọi, đối số thực tế được thay thế cho các tham số chính thức, và cơ thể phương thức được đánh giá.

Khi một tuyên bố chung được gọi, các đối số loại thực tế đang thay thế cho các thông số loại chính thức. Và đó là> tầm quan trọng của Generics.

Bạn có thể xem ở đây cho more information about Generics

+0

@ user2440792 chấp nhận câu trả lời nếu câu hỏi của bạn được trả lời .. http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – Dileep

1

này:

List<E>[] x = new List[100]; 

Nói rằng x là một kiểu Array. Các phần tử của mảng đó là Danh sách có thể giữ các đối tượng là loại E. Và bạn đang gán cho nó một mảng danh sách có thể giữ đối tượng bất kỳ.

Bản tuyên bố tiếp theo:

List<E>[] x = (List<E>[]) new List[100]; 

là không tốt. Đúc sẽ không giúp ích gì. Lỗ hổng vẫn như cũ.

Cuối cùng, tất cả điều này là một cái cớ để làm điều này:

List<E>[] x = new List<E>[100]; 

Và Generics mảng không được phép vào Java. Bởi vì các mảng giữ nguyên kiểu phần tử của chúng khi chạy, trong khi các cấu trúc chung thì không. Không được có mảng mà kiểu phần tử của nó không được xác định nghiêm ngặt.

Sự cố là do xác định loại tham chiếu List<E>[] theo định nghĩa, không được phép được khởi tạo trong Java. Vì vậy, tránh sử dụng các loại như vậy.

Bạn có thể sử dụng Danh sách danh sách thay thế.

1

Như trong loại đối tượng generics được lưu trữ trong bộ sưu tập bất kỳ sẽ được kiểm tra loại tại thời điểm chúng được thêm vào bộ sưu tập. Chủ yếu thông qua generics, mã có thể được dễ hiểu bởi những người khác những người không cần phải biết về Generics. Vì vậy, bằng cách chèn kiểm tra tại thời gian biên dịch và xóa tại thời gian chạy cho phép hành vi này.

bạn có thể thấy: http://docs.oracle.com/javase/tutorial/java/generics/

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