Bài giảng Lập trình Java - Bài 6: Genegic
Khái niệm Generics
Thuật ngữ “Generics” nghĩa là tham số hóa
kiểu dữ liệu. Tham số hóa kiểu dữ liệu rất
quan trọng vì nó cho phép chúng ta tạo ra
và sử dụng một class, interface, method với
nhiều kiểu dữ liệu khác nhau.
Một class, interface hay một method mà
thực hiện trên một kiểu tham số xác định
thì gọi là generic.
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình Java - Bài 6: Genegic", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
Tóm tắt nội dung tài liệu: Bài giảng Lập trình Java - Bài 6: Genegic
LẬP TRÌNH JAVA Bài 6: Genegic Điểm danh Enumerations Autoboxing Static Import Annotations Nhắc lại bài trước Khái niệm Genegics Ưu điểm Genegics Tạo class generic và method Giới hạn kiểu dữ liệu Các ký hiệu đại diện Generic method Generic Interface Một số hạn chế Nội dung bài học Khái niệm Generics Thuật ngữ “Generics” nghĩa là tham số hóa kiểu dữ liệu. Tham số hóa kiểu dữ liệu rất quan trọng vì nó cho phép chúng ta tạo ra và sử dụng một class, interface, method với nhiều kiểu dữ liệu khác nhau. Một class, interface hay một method mà thực hiện trên một kiểu tham số xác định thì gọi là generic. Khái niệm Generics Ví dụ: Sử dụng ArrayList với các kiểu dữ liệu khác nhau ArrayList mylist = new ArrayList(); mylist.add(10); mylist.add(“Hello”); mylist.add(true); mylist.add(15.75); Lấy ra: int a = (Integer)mylist.get(0); String str = (String)mylist.get(1); Khái niệm Generics Ví dụ: Sử dụng ArrayList với các kiểu dữ liệu Integer ArrayListmylist = new ArrayList(); mylist.add(10); mylist.add(“Hi”);//error mylist.add(true);//error mylist.add(15); Lấy ra: int a = mylist.get(0); Generic Khái niệm Generics Ví dụ: Sử dụng ArrayList với các kiểu dữ liệu String ArrayListmylist = new ArrayList(); mylist.add(“Hello”); mylist.add(“Goodbye”); Lấy ra: String str = mylist.get(0); Ưu điểm của generic Kiểm tra kiểu dữ liệu trong thời điểm dịch Trình biên dịch Java áp dụng việc kiểm tra đoạn mã generic để phát hiện các vấn đề như vi phạm an toàn kiểu dữ liệu. Việc sửa lỗi tại thời gian biên dịch dễ dàng hơn nhiều khi sửa chữa lỗi tại thời điểm chạy chương trình. Compile error ! Ưu điểm của generic Không cần ép kiểu dữ liệu Đoạn code sau đây không dùng generic nên phải ép kiểu: List list = new ArrayList(); list.add("hello"); String s = (String) list.get(0); //phải ép kiểu Khi dùng generic, không cần ép kiểu: List list = new ArrayList(); list.add("hello"); String s = list.get(0); //không ép kiểu Ưu điểm của generic Cho phép người trình viên thực hiện các thuật toán tổng quát. Bằng cách sử dụng generics, người lập trình có thể thực hiện các thuật toán tổng quát với các kiểu dữ liệu tùy chọn khác nhau, và nội dung đoạn code trở nên rõ ràng và dễ hiểu. PROGRAMS Tạo class generic và method Quy ước đặt tên tham số kiểu cho Generics Ký tự Ý nghĩa E Element – phần tử K Key – khóa V Value – giá trị T Type – kiểu dữ liệu N Number – số Tạo class generic và method Tạo generics class với 1 tham số kiểu: Tạo class generic và method Tạo generics class với 1 tham số kiểu: Tạo class generic và method Tạo generics class với 2 tham số kiểu: public class Pair { private T first; private S second; public Pair(T fi, S se){ first = fi; second = se; } public T getFirst() { return first; } public S getSecond() { return second; } } Tạo class generic và method public class PairDemo{ public static void main(String[] args){ Pair p1 = new Pair(1,"One"); Pair p2 = new Pair("Hello","World"); System.out.println(p1.getFirst()+", "+p1.getSecond()); System.out.println(p2.getFirst()+", "+p2.getSecond()); } } Tạo generics class với 2 tham số kiểu: Giới hạn kiểu dữ liệu Giới hạn kiểu dữ liệu Các ký hiệu đại diện generic Wildcards Các ký hiệu đại diện generics Xét ví dụ sau: Các ký hiệu đại diện generics Ký tự đại diện public void processEle(List elements){ ... } Các ký hiệu đại diện generics Ký tự đại diện List listA = new ArrayList(); processEle(listA); List listB = new ArrayList(); processEle(listB); List listC = new ArrayList(); processEle(listC); Trong đó : Class A Class B Class C public void processEle(List elements){ for(A obj : elements){ System.out.println(obj.getValue()); } } Các ký hiệu đại diện generics Ký tự đại diện List listA = new ArrayList(); processEle(listA); List listO = new ArrayList(); processEle(listO); Generic Constructors public class Summation { private int sum; Summation(T size) { sum = 0; for (int i = 0; i <= size.intValue(); i++) { sum += i; } } int getSum() {return sum;} public static void main(String[] args) { Summation obj = new Summation(4.0); System.out.println("Sum of 1->4 is " + obj.getSum()); } } Generic Interfaces interface Containment{ boolean contains(T obj); } public class MyClass implements Containment{ T[] arrayRef; MyClass(T[] arr){ arrayRef = arr; } public boolean contains(T obj) { for (T x:arrayRef) if (x.equals(obj)) return true; return false; } } Generic Interfaces public static void main(String[] args) { Integer x[]={1,2,3}; MyClass ob = new MyClass(x); Integer a = 20; if (ob.contains(a)){ System.out.println(a+" in array"); }else System.out.println(a+" NOT in array"); } Một số hạn chế của Generic Không thể khởi tạo generic với dữ liệu kiểu nguyên thủy Pair p = new Pair(8, 'a'); //error Pair p = new Pair(8, 'a'); Không thể tạo instance cho kiểu dữ liệu class Gen{ T obj; Gen(){ obj= new T(); //Illegal } } Một số hạn chế của Generic Không thể là static trong class class Gen{ static T obj; //Kiểu T không thể là static static T getObj(){ //Phương thức không thể static return obj; } } Một số hạn chế của Generic Không thể tạo mảng Gen gens[]=new Gen[10]; //error Gen gens[] = new Gen[10]; //ok Gens[0] = new Gen(25); Gens[1] = new Gen(“Hello”); Giới hạn về ngoại lệ generic Một class generic không thể kế thừa class Throwable. Do đó ta không thể tạo class ngoại lệ là generic. Khái niệm Genegic Ưu điểm Genegic Tạo class generic và method Giới hạn kiểu dữ liệu Các ký hiệu đại diện Generic method Generic Interface Một số hạn chế Tổng kết bài học
File đính kèm:
- bai_giang_lap_trinh_java_bai_6_genegic.pdf