2013-08-12 22 views
5

Tôi đang đọc thẻ hoang dã đa cấp từ AngelikaLangerGenericsFaq. Tôi khá bối rối về cú pháp. Tài liệu này nóiThẻ hoang dã đa cấp là gì? Lẫn lộn trong cú pháp

Loại Collection<Pair<String,?>> là một instantiation cụ thể của giao diện Bộ sưu tập chung. Nó là một bộ sưu tập khác nhau của cặp các loại khác nhau. Nó có thể chứa các thành phần thuộc loại Pair<String,Long>, Pair<String,Date>, Pair<String,Object>, Pair<String,String>, v.v. Nói cách khác, Collection<Pair<String,?>> chứa hỗn hợp các loại khác nhau của biểu mẫu Pair<String,?>.

Loại Collection<? extends Pair<String,?>> là ký tự đại diện loại tham số; nó KHÔNG đứng cho một loại tham số cụ thể là . Nó đại diện cho một đại diện từ gia đình của bộ sưu tập tức là giao diện Bộ sưu tập, trong đó đối số loại có dạng Pair<String,?>. Tương thích tức thì là Collection<Pair<String,Long>>, Collection<Pair<String,String>>, Collection<Pair<String,Object>> hoặc Collection<Pair<String,?>>. Trong các từ khác, chúng tôi không biết được Bộ sưu tập nào là Bộ sưu tập mà nó là viết tắt của.

Theo quy tắc chung, bạn phải đọc từ điển đa cấp từ trên xuống dưới.

Tôi nhầm lẫn về các điểm sau đây.

  1. Ai đó có thể xây dựng trên ba trích dẫn này với ví dụ. Tôi hoàn toàn bị mất vào cú pháp
  2. Tài liệu nói, para-1 là sự khởi tạo cụ thể của một loại chung chung và khác không phải là sự khởi tạo cụ thể? Làm như thế nào?
  3. Có nghĩa là gì khi đọc thẻ từ trên xuống dưới?
  4. Lợi thế của thẻ hoang dã đa cấp là gì?

Ai đó có thể giải thích những điểm này. Cảm ơn.

Trả lời

11

Ai đó có thể xây dựng trên ba trích dẫn này với ví dụ. Tôi hoàn toàn bị mất vào cú pháp

Vâng, sẽ không có ý nghĩa khi viết 3 trích dẫn lại ở đây. Vì, tôi không thể đưa ra lời giải thích tốt hơn thế. Thay vào đó, tôi sẽ cố gắng trả lời các câu hỏi khác của bạn bên dưới, sau đó có thể bạn cũng sẽ hiểu câu hỏi này. Nếu không, bạn có thể yêu cầu lại truy vấn của mình. Tôi sẽ cố gắng xây dựng thêm một chút nữa.

Tài liệu nói, para-1 là sự khởi tạo cụ thể của loại chung và khác không phải là sự khởi tạo cụ thể? Làm như thế nào?

Sự khởi tạo cụ thể là một trong đó tất cả các đối số kiểu là loại cụ thể và được biết tại thời gian biên dịch. Ví dụ:, List<String> là một thuyết trình cụ thể, bởi vì String là một loại cụ thể. Đó là loại được biết đến tại thời gian biên dịch. Trong khi đó, List<? extends Number> không phải là loại cụ thể, bởi vì ? extends Number có thể là bất kỳ loại nào mở rộng Number. Vì vậy, nó là loại không biết tại thời gian biên dịch. Tương tự, Map<String, Integer> là sự khởi tạo cụ thể của loại chung Map<K, V>.

Trong trường hợp của các tham số kiểu đa cấp, List<List<? extends Number>>, bên ngoài List là một instantiation cụ thể của List<E>, bởi vì các loại nguyên tố được biết đến là một List tại thời gian biên dịch, mặc dù khu vực nội List là một instantiation ký tự đại diện, như loại phần tử được lưu trữ có thể là Integer, Double, bất kỳ lớp con nào của Number. Nhưng đoạn đó chỉ nói về loại ngoài. Và loại bên ngoài chỉ có thể chứa loại List. Đó là lý do tại sao đoạn đầu tiên cho biết, đó là một bộ sưu tập không đồng nhất của Pair, bởi vì tham số kiểu thực tế của Pair có thể là bất cứ điều gì, nhưng chắc chắn là Pair và không có gì khác.

Có nghĩa là gì khi đọc thẻ từ trên xuống dưới?

Nói theo thuật ngữ của giáo dân, nó có nghĩa là từ trái sang phải. Trong khi xác định loại kiểu được tham số hóa, trước tiên bạn sẽ thấy tham số kiểu ngoài cùng. Sau đó, nếu tham số kiểu đó là chính nó là một kiểu tham số, thì bạn di chuyển lên các tham số kiểu của kiểu tham số đó. Vì vậy, chúng ta đọc các tham số kiểu, từ trái sang phải.

Lợi thế của thẻ hoang dã đa cấp là gì?

Giả sử bạn muốn tạo Danh sách các loại trái cây. Bây giờ bên trong của bạn List có thể chứa bất kỳ loại trái cây nào. An apple cũng là một quả và một quả chuối cũng là một quả . Vì vậy, bạn phải chắc chắn rằng bạn nhận được tất cả chúng. Bây giờ, vì các loại chung là bất biến, theo nghĩa, List<Apple> không giống như List<Fruit>, bạn không thể thêm List<Apple> nếu loại danh sách của bạn là List<List<Fruit>>. Để làm điều đó, bạn cần sử dụng wildcards như thế này - List<List<? extends Fruit>>, hiện có thể lấy List<Apple>, List<Banana>, danh sách bất kỳ loại trái cây nào.

+0

cảm ơn rohit vì lời giải thích chi tiết như vậy. Cho phép xem Bộ sưu tập >, nó bao gồm một ký hiệu thẻ hoang dã sau đó làm thế nào nó có thể được cụ thể, trình biên dịch sẽ không biết những gì các loại khác. Làm thế nào chúng ta có thể gọi nó là cụ thể sau đó? – benz

+1

@benz. Tôi chỉ cần thêm một lời giải thích về điều đó. Vui lòng kiểm tra chỉnh sửa. –

+0

Giải thích tuyệt vời Rohit. Cảm ơn bạn. Tôi có một số nghi ngờ trong cùng một chủ đề, tôi đang hoàn thành và sẽ chỉnh sửa câu hỏi bởi vì nó là khá có liên quan để thêm chúng ở đây. – benz

0

Loại chung với ký tự đại diện thực sự là các loại "hiện hữu". Nếu bạn quen thuộc với logic, bạn có thể đọc G< ? extends T > là ∃ S extends T:G<S>.

Lời giải thích của Angela về các loại đọc "từ trên xuống" thực sự có nghĩa là định lượng tồn tại tưởng tượng ngụ ý bởi loại có chứa ? trong đó luôn gần nhất có thể với ?. Ví dụ: bạn nên viết lại tinh thần G< H< ? extends T > > đến G<S extends T:H<S> >. Vì không có định lượng ở bên ngoài, nó được gọi là bê tông.