Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 38 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
38
Dung lượng
385,85 KB
Nội dung
GV: NGUYỄN XUÂN VINH MÔN: CẤU TRÚC DỮ LIỆU CẤU TRÚC DỮ LIỆU DATA STRUCTURES [214331] JAVA GENERICS /XX 12/3/15 Source: Nguyễn Văn Khiêm GV: NGUYỄN XUÂN VINH MÔN: CẤU TRÚC DỮ LIỆU 12/3/15 /XX Nội dung Giới thiệu Generic Generic Java Lớp Generic Phương thức Generic Giới hạn (bound) biến kiểu (Type variables) Wildcard Generic Máy ảo Java Các lớp Generic Collection Hạn chế Generic Kết luận Bài tập GV: NGUYỄN XUÂN VINH Giới thiệu Generic Lập trình Generic đề xướng ngôn ngữ Ada năm 1983 Cho phép giải thuật dựa kiểu xác định sau, kiểu thể cần thiết /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU Định nghĩa kiểu mức trừu tượng Các kiểu thay nhiều kiểu cụ thể (class, interface) khác sử dụng Hiện Generic có Ada, Java, Template C++, C#, Visual Basic, Net, Eiffel Haskell /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Generic Java Trước jdk1.5: • Trước jdk1.5: MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH JDK 1.4 Phải ép kiểu /XX 12/3/15 Ném ngoại lệ chạy GV: NGUYỄN XUÂN VINH Một giải pháp tồi Chúng ta tạo class sau để chứa danh sách Student: class StudentList { void add(Student element) { } Student remove(int index) { } /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU } Nhưng, cần danh sách chứa đối tượng Teacher? Copy-paste? Sử dụng Generic • Từ jdk1.5: MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Generic Java (tt) Lỗi biên dịch /XX 12/3/15 Không phải ép kiểu /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Lớp Generic Là lớp với nhiều biến kiểu GV: NGUYỄN XUÂN VINH Lớp Generic Là lớp với nhiều biến kiểu Các biến kiểu khai báo cách /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU dấu phẩy GV: NGUYỄN XUÂN VINH Lớp Generic Là lớp với nhiều biến kiểu Các biến kiểu khai báo cách 10 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU dấu phẩy Sử dụng biến kiểu để khai báo thuộc tính GV: NGUYỄN XUÂN VINH MÔN: CẤU TRÚC DỮ LIỆU Wildcard (tt) Chúng ta muốn tập nguồn 24 /XX 12/3/15 Lỗi biên dịch “read-only” 25 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Wildcard (tt) Sử dụng lower bound OK GV: NGUYỄN XUÂN VINH Generic Máy ảo Java Generic cài đặt trình biên dịch 26 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU Trình chuyển đổi erasure loại bỏ hết Generic trước cho xuống máy ảo Máy ảo thay đổi hoàn toàn tương thích với phiên trước 27 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Generic Máy ảo Java (tt) 28 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Generic Máy ảo Java (tt) Giả sử có lớp IntegerFoo sau: MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Generic Máy ảo Java (tt) Lớp IntegerFoo 29 /XX 12/3/15 chuyển xuống JM nào? 30 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Generic Máy ảo Java (tt) Phương thức cầu nối GV: NGUYỄN XUÂN VINH Các lớp Generic Collection Các lớp Collection Java viết để hỗ trợ Generic Cho phép an toàn kiểu Generic áp dụng cho tất lớp 31 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU Xác định kiểu mà lớp Collection chứa Nếu chèn kiểu không khớp 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ảnh báo biên dịch (warning) Có thể biến đổi collection có kiểu thành collection kiểu thô 32 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Ví dụ lớp Generic List GV: NGUYỄN XUÂN VINH MÔN: CẤU TRÚC DỮ LIỆU 12/3/15 /XX 33 Hạn chế Generic • Không thể sử dụng kiểu liệu nguyên thủy cho Generic • Không cho phép kế thừa 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ệ GV: NGUYỄN XUÂN VINH Hạn chế Generic (tt) Các ví dụ Generic sau không Java: Foo foo = new Foo(); MÔN: CẤU TRÚC DỮ LIỆU class ABC extends T {} T t = new T(); T[] tArray = new T[10]; public static T t; try{ 34 /XX 12/3/15 } catch (T e) {} GV: NGUYỄN XUÂN VINH Hạn chế Generic (tt) Tương tự với Generic Java Template/Generic C++/C# NET MÔN: CẤU TRÚC DỮ LIỆU • • Template/ Generic C++/C#: – dùng kiểu liệu nguyên thủy cho class – Không cho phép kế thừa Template/Generic – Cho phép sử dụng Template/Generic với static Trong Net, giống Java, cung cấp sẵn namespace System.Collections.Generic, bao gồm vài 35 /XX 12/3/15 lớp Collection viết sẵn GV: NGUYỄN XUÂN VINH Kết luận Generic phần thiếu ngôn ngữ lập trình hướng đối tượng 36 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU Làm tăng tính đa hình Java Hạn chế tối đa lỗi chạy Khả sử dụng lại code giới hạn Tuy nhiên dùng nhiều Generic làm code trở nên phức tạp, khó sử dụng GV: NGUYỄN XUÂN VINH Bài tập • Thiết kế lớp hoạt động thư viện cho loại phương tiện truyền thông sách, video, báo 37 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU tạp chí • Kết phiên có Generic phiên Generic • Có thể sử dụng API thêm để lưu trữ tìm kiếm phương tiện truyền thông 38 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH HỎI ĐÁP [...]... trước 27 /XX 12/ 3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Generic và Máy ảo Java (tt) 28 /XX 12/ 3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Generic và Máy ảo Java (tt) Giả sử chúng ta có lớp IntegerFoo như sau: MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Generic và Máy ảo Java (tt) Lớp IntegerFoo sẽ được 29 /XX 12/ 3/15 chuyển xuống JM như thế nào? 30 /XX 12/ 3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN... báo nhưng không được sử dụng GV: NGUYỄN XUÂN VINH MÔN: CẤU TRÚC DỮ LIỆU Wildcard (tt) Chúng ta muốn tập nguồn 24 /XX 12/ 3/15 Lỗi biên dịch là “read-only” 25 /XX 12/ 3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Wildcard (tt) Sử dụng lower bound OK GV: NGUYỄN XUÂN VINH Generic và Máy ảo Java Generic chỉ được cài đặt ở trình biên dịch 26 /XX 12/ 3/15 MÔN: CẤU TRÚC DỮ LIỆU Trình chuyển đổi erasure... 12/ 3/15 MÔN: CẤU TRÚC DỮ LIỆU second? 14 /XX 12/ 3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Giới hạn của các kiểu biến (tt) Giải pháp? Làm sao để T có thể được so sánh? 15 /XX 12/ 3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Giới hạn của các kiểu biến (tt) Lỗi biên dịch GV: NGUYỄN XUÂN VINH 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 16 /XX 12/ 3/15 MÔN: CẤU... dst); 21 /XX 12/ 3/15 MÔN: CẤU TRÚC DỮ LIỆU 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 GV: NGUYỄN XUÂN VINH MÔN: CẤU TRÚC DỮ LIỆU 12/ 3/15 /XX 22 Wildcard (tt) Sử dụng Generic mà không cần khai báo kiểu 23 /XX 12/ 3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Wildcard... collection kiểu thô 32 /XX 12/ 3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Ví dụ lớp Generic List GV: NGUYỄN XUÂN VINH MÔN: CẤU TRÚC DỮ LIỆU 12/ 3/15 /XX 33 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ệ GV: NGUYỄN XUÂN VINH Hạn chế...GV: NGUYỄN XUÂN VINH MÔN: CẤU TRÚC DỮ LIỆU Lớp Generic(tt) Lỗi biên dịch Không cần ép kiểu, không cần 11 /XX 12/ 3/15 bắt ngoại lệ GV: NGUYỄN XUÂN VINH 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 12 /XX 12/ 3/15 MÔN: CẤU TRÚC DỮ LIỆU Generic Lỗi biên dịch GV: NGUYỄN XUÂN VINH Giới hạn của các kiểu biến... Comparable 16 /XX 12/ 3/15 MÔN: CẤU TRÚC DỮ LIỆU Giới hạn T GV: NGUYỄN XUÂN VINH MÔN: CẤU TRÚC DỮ LIỆU 12/ 3/15 /XX 17 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 GV: NGUYỄN XUÂN VINH Wildcard Java cho phép sử dụng các Wildcard để xác định biên của kiểu tham số Generic 18 /XX 12/ 3/15 MÔN: CẤU TRÚC DỮ LIỆU Được sử dụng khi: Không... Foo foo = new Foo(); MÔN: CẤU TRÚC DỮ LIỆU class ABC extends T {} T t = new T(); T[] tArray = new T[10]; public static T t; try{ 34 /XX 12/ 3/15 } catch (T e) {} GV: NGUYỄN XUÂN VINH Hạn chế của Generic (tt) Tương tự với Generic trong Java là Template/Generic trong C++/C# và NET MÔN: CẤU TRÚC DỮ LIỆU • • Template/ Generic trong C++/C#: – dùng được các kiểu dữ liệu nguyên thủy và cho các class... So, it can contain any things GV: NGUYỄN XUÂN VINH MÔN: CẤU TRÚC DỮ LIỆU 12/ 3/15 /XX 20 Josh Bloch’s Bounded Wildcards Rule The rule is: PECS (Producer-Extends, Comsumer-Super) Use ... 12/ 3/15 MÔN: CẤU TRÚC DỮ LIỆU second? 14 /XX 12/ 3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Giới hạn kiểu biến (tt) Giải pháp? Làm để T so sánh? 15 /XX 12/ 3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN... Stack GV: NGUYỄN XUÂN VINH MÔN: CẤU TRÚC DỮ LIỆU 12/ 3/15 /XX 22 Wildcard (tt) Sử dụng Generic mà không cần khai báo kiểu 23 /XX 12/ 3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Wildcard... sử dụng GV: NGUYỄN XUÂN VINH MÔN: CẤU TRÚC DỮ LIỆU Wildcard (tt) Chúng ta muốn tập nguồn 24 /XX 12/ 3/15 Lỗi biên dịch “read-only” 25 /XX 12/ 3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Wildcard