Chương 2 Java Generics

Lập trình Generic được đề xướng bởi ngôn ngữ Ada năm 1983. Cho phép các giải thuật có thể dựa trên các kiểu được xác định sau, và các kiểu này sẽ được thể hiện khi cần thiết. Định nghĩa các kiểu ở mức trừu tượng. Các kiểu này có thể được thay thế bằng nhiều kiểu cụ thể (class, interface) khác khi sử dụng. Hiện nay Generic có trong Ada, Java, Template trong C++, C#, Visual Basic, .Net, Eiffel và Haskell

pptx37 trang | Chia sẻ: lylyngoc | Lượt xem: 2080 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Chương 2 Java Generics, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Click to edit Master title style Click to edit Master text styles Second level Third level Fourth level 18/09/2013 ‹#› /XX MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH JAVA GENERICS CẤU TRÚC DỮ LIỆU DATA STRUCTURES [214331] Source: Nguyễn Văn Khiêm Nội dung chính Giới thiệu về Generic. Generic trong Java. Lớp Generic. Phương thức Generic. Giới hạn (bound) của các biến kiểu (Type variables). Wildcard. Generic và Máy ảo Java. Các lớp Generic Collection. Hạn chế của Generic. Kết luận. Bài tập. Giới thiệu về Generic Lập trình Generic được đề xướng bởi ngôn ngữ Ada năm 1983. Cho phép các giải thuật có thể dựa trên các kiểu được xác định sau, và các kiểu này sẽ được thể hiện khi cần thiết. Định nghĩa các kiểu ở mức trừu tượng. Các kiểu này có thể được thay thế bằng nhiều kiểu cụ thể (class, interface) khác khi sử dụng. Hiện nay Generic có trong Ada, Java, Template trong C++, C#, Visual Basic, .Net, Eiffel và Haskell Generic trong Java Trước jdk1.5: JDK 1.4 Trước jdk1.5: Phải ép kiểu Ném ngoại lệ khi chạy Một giải pháp tồi Chúng ta có thể tạo class sau chỉ để chứa danh sách Student: class StudentList { void add(Student element) { ... } Student remove(int index) { ... } } Nhưng, khi cần một danh sách chỉ chứa đối tượng Teacher? Copy-paste? Generic trong Java (tt) Từ jdk1.5: Không phải ép kiểu Lỗi ngay khi biên dịch Sử dụng Generic Lớp Generic Là lớp với một hoặc nhiều biến kiểu. Lớp Generic Là lớp với một hoặc nhiều biến kiểu. Các biến kiểu khai báo cách nhau bởi dấu phẩy Lớp Generic Là lớp với một hoặc nhiều biến kiểu. Các biến kiểu khai báo cách nhau bởi dấu phẩy Sử dụng các biến kiểu để khai báo thuộc tính Lớp Generic(tt) Lỗi biên dịch Không cần ép kiểu, không cần bắt ngoại lệ Phương thức Generic Ta có thể định nghĩa một phương thức với các tham số kiểu ngay trong một lớp bình thường hoặc một lớp Generic. Lỗi biên dịch Giới hạn của các kiểu biến Làm thế nào để first luôn nhỏ hơn second? Giới hạn của các kiểu biến (tt) Giải pháp? Giới hạn của các kiểu biến (tt) Làm sao để T có thể được so sánh? Lỗi biên dịch Giới hạn của các kiểu biến (tt) Cần phải giới hạn T trong Interface Comparable. Giới hạn T Giới hạn của các kiểu biến (tt) Một kiểu biến có thể có nhiều giới hạn. Giới hạn T vừa có thể so sánh, vừa có thể sao chép Wildcard Java cho phép sử dụng các Wildcard để xác định biên của kiểu tham số Generic. Được sử dụng khi: Không biết kiểu Generic là gì. Các kiểu Generic được khai báo nhưng không được sử dụng. Chúng ta muốn kiểu Generic là “read-only”. Bounded Wildcards Upper bound (Wildcard biên trên) List items at least Fruits So, it can contain Fruits and Apple, Oranges, but not Pigs Lower bound (Wildcard biên dưới) List items most Fruits So, it can contain Fruits and Objects but not Apples Unknown bound (Wildcard không biên) List any items So, it can contain any things. Josh Bloch’s Bounded Wildcards Rule The rule is: PECS (Producer-Extends, Comsumer-Super) Use when parameterized instance is a T producer (for reading/input) Use when parameterized instance is a T comsumer (for writing/output) Josh Bloch’s Bounded Wildcards Rule Giả sử, cần thêm một lúc nhiều phần tử và Stack void pushAll(Collection src); src là một E producer void popAll(Collection dst); dst là một E consumer Có thể pushAll từ Collection hoặc Collection bỏ vào Stack Có thể popAll từ Collection hoặc Collection từ Stack Wildcard (tt) Sử dụng Generic mà không cần khai báo kiểu Wildcard (tt) T được khai báo nhưng không được sử dụng Wildcard (tt) Chúng ta muốn tập nguồn là “read-only” Lỗi biên dịch Wildcard (tt) Sử dụng lower bound OK Generic và Máy ảo Java Generic chỉ được cài đặt ở trình biên dịch. Trình chuyển đổi erasure sẽ loại bỏ hết Generic trước khi cho xuống máy ảo. Máy ảo không có thay đổi nào và hoàn toàn tương thích với các phiên bản trước. Generic và Máy ảo Java (tt) Generic và Máy ảo Java (tt) Generic và Máy ảo Java (tt) Giả sử chúng ta có lớp IntegerFoo như sau: Lớp IntegerFoo sẽ được chuyển xuống JM như thế nào? Generic và Máy ảo Java (tt) Phương thức cầu nối Các lớp Generic Collection Các lớp Collection của Java đã được viết để hỗ trợ Generic. Cho phép an toàn về kiểu. Generic áp dụng cho tất cả các lớp. Xác định kiểu mà lớp Collection đang chứa. Nếu chèn kiểu không khớp sẽ báo lỗi biên dịch. Việc thêm bớt phần tử không cần ép kiểu. Tương thích ngược với dạng kiểu thô. Có thể phát sinh các cảnh báo biên dịch (warning). Có thể biến đổi một collection có kiểu thành collection kiểu thô. Ví dụ lớp Generic List Hạn chế của Generic Không thể sử dụng kiểu dữ liệu nguyên thủy cho Generic. Không cho phép kế thừa một Generic. Không cho phép khởi tạo Generic. Không sử dụng Generic với static. Không dùng Generic để bắt ngoại lệ. Hạn chế của Generic (tt) Các ví dụ Generic sau đây là không đúng trong Java: Foo foo = new Foo(); class ABC extends T {} T t = new T(); T[] tArray = new T[10]; public static T t; try{ } catch (T e) {} Hạn chế của Generic (tt) Tương tự với Generic trong Java là Template/Generic trong C++/C# và .NET. Template/ Generic trong C++/C#: dùng được các kiểu dữ liệu nguyên thủy và cho các class. Không cho phép kế thừa một Template/Generic. Cho phép sử dụng Template/Generic với static. Trong .Net, giống như Java, cung cấp sẵn một namespace System.Collections.Generic, bao gồm một vài lớp Collection viết sẵn. Kết luận Generic là một phần không thể thiếu trong các ngôn ngữ lập trình hướng đối tượng. Làm tăng tính đa hình trong Java. Hạn chế tối đa các lỗi khi chạy. Khả năng sử dụng lại code là không có giới hạn. Tuy nhiên dùng quá nhiều Generic làm code trở nên phức tạp, khó sử dụng. Bài tập Thiết kế một lớp hoạt động như một thư viện cho các loại phương tiện truyền thông như sách, video, báo và tạp chí. Kết quả là một phiên bản có Generic và phiên bản không có Generic. Có thể sử dụng bất kỳ API nào thêm để lưu trữ và tìm kiếm phương tiện truyền thông. HỎI ĐÁP