hướng dẫn sử dụng java generics

13
Hướng dẫn sử dụng Java Generics *** 1- Tại sao Java Generics 2- Kiểu Generic Class, Interface 2.1- Class Generics 2.2- Thừa kế class Generics 2.3- Interface Generics 3- Phương thức generics 4- Mảng Generic 5- Generics với ký tự đại diện TÀI LIỆU ĐANG ĐƯỢC CÂP NHẬP 80% 1- Tại sao Java Generics Generics là một khái niệm được đưa vào Java từ phiên bản 5. Trước khi đưa ra khái niệm Generics là gì, chúng ta hãy xem một đoạn code của Java trước phiên bản 5. Trong ví dụ này ArrayList là một danh sách, bạn có thể thêm, xóa, sửa trong danh sách, và truy cập vào các phần tử của danh sách. BeforeJ5Example.java ? 1 2 3 4 5 6 7 8 package org.o7planning.tutorial.generics; import java.util.ArrayList; public class BeforeJ5Example { public static void main(String[] args) { // Tạo một đối tượng danh sách.

Upload: ke-lu-khach

Post on 09-Dec-2015

33 views

Category:

Documents


3 download

DESCRIPTION

Hướng Dẫn Sử Dụng Java Generics

TRANSCRIPT

Page 1: Hướng Dẫn Sử Dụng Java Generics

Hướng dẫn sử dụng Java Generics ***

1- Tại sao Java Generics

2- Kiểu Generic Class, Interface

2.1- Class Generics

2.2- Thừa kế class Generics

2.3- Interface Generics

3- Phương thức generics

4- Mảng Generic

5- Generics với ký tự đại diện

TÀI LIỆU ĐANG ĐƯỢC CÂP NHẬP 80%

1- Tại sao Java Generics ▴

Generics là một khái niệm được đưa vào Java từ phiên bản 5. Trước khi đưa ra khái

niệm Generics là gì, chúng ta hãy xem một đoạn code của Java trước phiên bản 5.

Trong ví dụ này ArrayList là một danh sách, bạn có thể thêm, xóa, sửa trong danh

sách, và truy cập vào các phần tử của danh sách.

BeforeJ5Example.java

?

1

2

3

4

5

6

7

8

package org.o7planning.tutorial.generics; import java.util.ArrayList;

public class BeforeJ5Example { public static void main(String[] args) { // Tạo một đối tượng danh sách.

Page 2: Hướng Dẫn Sử Dụng Java Generics

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

// Mục đích chứa các tên người dùng. ArrayList userNames = new ArrayList();

// Thêm String vào danh sách userNames.add("tom"); userNames.add("jerry"); // Bạn vô tình thêm một phần tử không phải String. // (Điều này hoàn toàn cho phép). userNames.add(new Integer(100)); // Và lấy ra phần tử đầu tiên // Nó là một Object (Nhưng bạn biết nó là một String) // ==> tom Object obj1 = userNames.get(0);

// Ép kiểu về String. String userName1 = (String) obj1;

System.out.println("userName1 = " + userName1); // Lấy ra phần tử thứ 2. // (Bạn biết nó là String) // ==> jerry String userName2 = (String) userNames.get(1);

System.out.println("userName2 = " + userName2); // Lấy ra phần tử thứ 3 (Thực tế nó là một Integer). // (Lỗi ép kiểu xẩy ra tại đây). String userName3 = (String) userNames.get(2); System.out.println("userName3 = " + userName3); } }

Một tình huống trong Java trước phiên bản 5:

Bạn tạo ra một đối tượng ArrayList với mục đích chỉ chứa các phần tử có kiểu String,

tuy nhiên tại nơi nào đó trong chương trình bạn thêm vào danh sách này một phần tử

không phải String (Việc này hoàn toàn có thể), khi bạn lấy ra các phần tử đó và ép kiểu

về String, một ngoại lệ sẽ bị ném ra.

TODO (Hinh minh hoa)

Page 3: Hướng Dẫn Sử Dụng Java Generics

Java 5 đưa vào khái niệm Generics. Với sự trợ giúp của Generics, bạn có thể tạo ra

một đối tượng ArrayList chỉ cho phép chứa các phần tử có kiểu String, và không cho

phép chứa các phần tử có kiểu khác.

J5Example.java

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

package org.o7planning.tutorial.generics; import java.util.ArrayList;

public class J5Example { public static void main(String[] args) { // Tạo một đối tượng danh sách. // Mục đích chứa các tên người dùng. ArrayList<String> userNames = new ArrayList<String>();

// Thêm String vào danh sách userNames.add("tom"); userNames.add("jerry"); // Bạn không thể thêm một phần tử khác kiểu String userNames.add(new Integer(100));

// Bạn không cần ép kiểu. String userName1 = userNames.get(0);

System.out.println("userName1 = " + userName1); } }

Page 4: Hướng Dẫn Sử Dụng Java Generics

Khi bạn tạo một đối tượng ArrayList<String>, nó chỉ chứa các phần tử có kiểu String,

trình biên dịch của Java không cho phép đối tượng này chứa các phần tử có kiểu khác

String.

2- Kiểu Generic Class, Interface ▴

2.1- Class Generics ▴

Ví dụ dưới đây định nghĩa ra một class generics. KeyValue là một class generics nó

chứa một cặp khóa và giá trị (key/value).

KeyValue.java

?

1

2

package org.o7planning.tutorial.generics.ci;

Page 5: Hướng Dẫn Sử Dụng Java Generics

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

public class KeyValue<K, V> { private K key; private V value; public KeyValue(K key, V value) { this.key = key; this.value = value; }

public K getKey() { return key; } public void setKey(K key) { this.key = key; } public V getValue() { return value; } public void setValue(V value) { this.value = value; }

}

K, V trong class KeyValue<K,V> được gọi là tham số generics nó là một kiểu tham

chiếu nào đó. Khi sử dụng class này bạn phải xác định kiểu tham số cụ thể.

Hãy xem ví dụ sử dụng class KeyValue.

KeyValueDemo.java

?

1

2

3

4

5

6

7

8

9

package org.o7planning.tutorial.generics.ci; public class KeyValueDemo {

public static void main(String[] args) { // Tạo một đối tượng KeyValue // Integer: Số điện thoại (K = Integer) // String: Tên người dùng. (V = String). KeyValue<Integer, String> entry = new KeyValue<Integer, String>(12000111, "Tom");

Page 6: Hướng Dẫn Sử Dụng Java Generics

10

11

12

13

14

15

16

17

18

19

20

21

// Java hiểu kiểu trả về là Integer (K = Integer). Integer phone = entry.getKey();

// Java hiểu kiểu trả về là String (V = String). String name = entry.getValue();

System.out.println("Phone = "+ phone+" / name = "+ name); }

}

Chạy ví dụ:

2.2- Thừa kế class Generics ▴

Một class mở rộng từ một class generics, nó có thể chỉ định rõ kiểu cho tham số

generics, giữ nguyên các tham số generics hoặc thêm các tham số generics.

Ví dụ 1:

PhoneNameEntry.java

?

1

2

3

4

5

6

7

8

9

10

11

12

13

package org.o7planning.tutorial.generics.ci; // Class này mở rộng từ class KeyValue<K,V> // Và chỉ định rõ K,V // K = Integer (Số điện thoại). // V = String (Tên người dùng). public class PhoneNameEntry extends KeyValue<Integer,String> { public PhoneNameEntry(Integer key, String value) { super(key, value); }

}

Page 7: Hướng Dẫn Sử Dụng Java Generics

Ví dụ sử dụng PhoneNameEntry:

PhoneNameEntryDemo.java

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

package org.o7planning.tutorial.generics.ci; public class PhoneNameEntryDemo { public static void main(String[] args) {

PhoneNameEntry entry = new PhoneNameEntry(12000111, "Tom"); // Java hiểu kiểu trả về là Integer. Integer phone = entry.getKey(); // Java hiểu kiểu trả về là String. String name = entry.getValue();

System.out.println("Phone = " + phone + " / name = " + name); }

}

Ví dụ 2:

StringAndValueEntry.java

?

1

2

3

4

5

6

7

8

9

10

11

12

package org.o7planning.tutorial.generics.ci;

// Class này mở rộng class KeyValue<K,V> // Xác định rõ kiểu tham số K là String. // Vẫn giữ kiểu tham số generic V. public class StringAndValueEntry<V> extends KeyValue<String, V> { public StringAndValueEntry(String key, V value) { super(key, value); }

}

Ví dụ sử dụng StringAndValueEntry claass:

StringAndValueEntryDemo.java

Page 8: Hướng Dẫn Sử Dụng Java Generics

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

package org.o7planning.tutorial.generics.ci; public class StringAndValueEntryDemo {

public static void main(String[] args) { // (Mã nhân viên, Tên nhân viên). // V = String (Tên nhân viên) StringAndValueEntry<String> entry = new StringAndValueEntry<String>("E001", "Tom"); String empNumber = entry.getKey();

String empName = entry.getValue(); System.out.println("Emp Number = " + empNumber); System.out.println("Emp Name = " + empName);

} }

Ví dụ 3:

KeyValueInfo.java

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

package org.o7planning.tutorial.generics.ci; // Class này mở rộng class KeyValue<K,V> // Nó có thêm một tham số generics I. public class KeyValueInfo<K, V, I> extends KeyValue<K, V> { private I info;

public KeyValueInfo(K key, V value) { super(key, value); }

public KeyValueInfo(K key, V value, I info) { super(key, value); this.info = info; } public I getInfo() { return info; }

Page 9: Hướng Dẫn Sử Dụng Java Generics

19

20

21

22

23

24

25

26

public void setInfo(I info) { this.info = info; } }

2.3- Interface Generics ▴

Một Interface có tham số Generics:

GenericInterface.java

?

1

2

3

4

5

6

7

8

package org.o7planning.tutorial.generics.ci; public interface GenericInterface<G> {

public G doSomething();

}

Ví dụ một class thi hành Interface:

GenericInterfaceImpl.java

?

1

2

3

4

5

6

7

8

9

10

11

12

package org.o7planning.tutorial.generics.ci; public class GenericInterfaceImpl<G> implements GenericInterface<G>{

private G something;

@Override public G doSomething() { return something; } }

3- Phương thức generics ▴

Page 10: Hướng Dẫn Sử Dụng Java Generics

Một phương thức trong class hoặc Interface có thể được generic hóa (generify).

MyUtils.java

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

package org.o7planning.tutorial.generics.m; import java.util.ArrayList;

import org.o7planning.tutorial.generics.ci.KeyValue; public class MyUtils {

// <K,V> : Nói rằng phương thức này có 2 kiểu tham số K,V // Phương thức trả về kiểu K. public static <K, V> K getKey(KeyValue<K, V> entry) { K key = entry.getKey(); return key; } // <K,V> : Nói rằng phương thức này có 2 kiểu tham số K,V // Phương thức trả về kiểu V. public static <K, V> V getValue(KeyValue<K, V> entry) { V value = entry.getValue(); return value; } // ArrayList<E>: Danh sách chứa các phần tử kiểu E // Phương thức trả về kiểu E. public static <E> E getFirstElement(ArrayList<E> list) { if (list == null || list.isEmpty()) { return null; } E first = list.get(0); return first; } }

Ví dụ sử dụng phương thức generics:

MyUtilsDemo.java

?

1

2

package org.o7planning.tutorial.generics.m;

Page 11: Hướng Dẫn Sử Dụng Java Generics

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

import java.util.ArrayList; import org.o7planning.tutorial.generics.ci.KeyValue;

public class MyUtilsDemo { public static void main(String[] args) {

// K = Integer: Phone // V = String: Name KeyValue<Integer, String> entry1 = new KeyValue<Integer, String>(12000111, "Tom"); KeyValue<Integer, String> entry2 = new KeyValue<Integer, String>(12000112, "Jerry"); // (K = Integer). Integer phone = MyUtils.getKey(entry1); System.out.println("Phone = " + phone); // Một danh sách chứa các phần tử kiểu KeyValue<Integer,String>. ArrayList<KeyValue<Integer, String>> list = new ArrayList<KeyValue<Integer, String>>(); // Thêm phần tử vào danh sách. list.add(entry1); list.add(entry2); KeyValue<Integer, String> firstEntry = MyUtils.getFirstElement(list);

System.out.println("Value = " + firstEntry.getValue()); }

}

4- Mảng Generic ▴

Bạn có thể khai báo một mảng generic, nhưng bạn không thể khởi tạo một mảng

generic.

?

1

2

3

4

5

6

7

8

// Khai báo một mảng generic T[] myarray;

// Nhưng không thể khởi tạo mảng generic. // (Điều này không được phép).

T[] myarray = new T[5];

Ví dụ:

Page 12: Hướng Dẫn Sử Dụng Java Generics

GenericArray.java

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

package org.o7planning.tutorial.generics.a;

public class GenericArray<T> { private T[] array; // Contructor. public GenericArray(T[] array) { this.array = array; } public T[] getArray() { return array; } // Trả về phần tử cuối cùng của mảng. public T getLastElement() { if (this.array == null || this.array.length == 0) { return null; } return this.array[this.array.length - 1]; } }

GenericArrayDemo.java

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

package org.o7planning.tutorial.generics.a;

public class GenericArrayDemo {

public static void main(String[] args) { // Một mảng các String. String[] names = new String[] { "Tom", "Jerry" }; GenericArray<String> gArray = new GenericArray<String>(names); String last = gArray.getLastElement();

System.out.println("Last Element = " + last); }

Page 13: Hướng Dẫn Sử Dụng Java Generics

15

16

17

}

5- Generics với ký tự đại

diện ▴

TODO