Bài giảng cấu trúc dữ liệu chương 2 nguyễn xuân vinh

38 343 0
Bài giảng cấu trúc dữ liệu  chương 2   nguyễn xuân vinh

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

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

Ngày đăng: 03/12/2015, 06:40

Từ khóa liên quan

Mục lục

  • Slide 1

  • Nội dung chính

  • Giới thiệu về Generic

  • Generic trong Java

  • JDK 1.4

  • Một giải pháp tồi

  • Generic trong Java (tt)

  • Lớp Generic

  • Lớp Generic

  • Lớp Generic

  • Lớp Generic(tt)

  • Phương thức Generic

  • Giới hạn của các kiểu biến

  • Giới hạn của các kiểu biến (tt)

  • Giới hạn của các kiểu biến (tt)

  • Giới hạn của các kiểu biến (tt)

  • Giới hạn của các kiểu biến (tt)

  • Wildcard

  • Bounded Wildcards

  • Josh Bloch’s Bounded Wildcards Rule

Tài liệu cùng người dùng

Tài liệu liên quan