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.

pdf 30 trang yennguyen 4420
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

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:

  • pdfbai_giang_lap_trinh_java_bai_6_genegic.pdf