Generics trong Java – VietTuts

Java Generics được thêm vào ngôn ngữ lập trình Java từ Java 5. Generics trong java là một cách để xác định các kiểu cụ thể cho các lớp và phương thức trong ngữ cảnh khác nhau. Nghe có vẻ hơi trừu tượng, vì vậy chúng ta sẽ xem xét lần lượt các khái niệm và một số ví dụ cụ thể.

Cụ thể trong bài này chúng ta sẽ học:

Một lớp có thể tham chiếu bất kỳ kiểu đối tượng nào được gọi là lớp generic.

Hãy xem ví dụ đơn giản sau về việc tạo và sử dụng lớp generic:

1. Tạo lớp generic MyGeneric.java:

Trong lớp trên, tham số <T> là một kiểu chung chung (bạn có thể sử dụng một ký tự bất kỳ khác T) đại diện cho bất kỳ một kiểu cụ nào.

Ví dụ khi bạn định nghĩa MyGeneric<Integer> tức là T = Integer, lúc này bạn có thể hình dung lớp MyGeneric có dạng như sau:

2. Tạo lớp TestGenerics3.java

Trong lớp trên, tại dòng lệnh thứ 6 chúng ta khai báo như sau MyGeneric<Integer>, có nghĩa là kiểu chung T sẽ là Integer. Tại dòng lệnh thứ 11 chúng ta khai báo như sau MyGeneric<String>, có nghĩa là kiểu chung T sẽ là String.

Việc đặt tên tham số là rất quan trọng để học genericis. Các tham số thông thường như sau:

Giống như lớp generic, chúng ta có thể tạo phương thức generic có thể chấp nhận bất kỳ kiểu đối số nào.

Chúng ta hãy xem một ví dụ đơn giản về phương thức generic trong java để in các phần tử của mảng. Chúng ta sử dụng E để biểu thị phần tử.

Kết quả:

Ký tự ? (dấu chấm hỏi) tượng trưng cho phần tử ký tự đại diện. Nó có nghĩa là bất kỳ loại nào. Nếu chúng ta viết <? mở rộng Number>, nó có nghĩa là bất kỳ lớp con của Number ví dụ như Integer, Float, Double vv. Bây giờ chúng ta có thể gọi phương thức của lớp Number qua bất kỳ đối tượng lớp con nào.

Hãy hiểu nó bằng ví dụ dưới đây:

Kết quả:

Trước Generics, chúng ta có thể lưu trữ bất kỳ loại đối tượng nào trong collection như Non-generic. Với generics, được các lập trình java áp dụng để lưu trữ các kiểu cụ thể của các đối tượng.

Ví dụ sử dụng Generics trong java:

Ở đây, chúng ta sử dụng lớp ArrayList, nhưng bạn có thể sử dụng bất kỳ lớp Collection khác như ArrayList, LinkedList, HashSet, TreeSet, HashMap, Comparator, vv

Kết quả:

Bây giờ chúng ta sẽ sử dụng Map để lưu trữ dữ liệu bằng cách sử dụng generics. Ở đây, chúng ta cần phải truyền key và value:

package vn.viettuts.generics;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

class TestGenerics2 {
    public static void main(String args[]) {
        Map<Integer, String> map = new HashMap<Integer, String>();
        map.put(1, "Java");
        map.put(4, "PHP");
        map.put(2, "C++");

        // Now use Map.Entry for Set and Iterator
        Set<Map.Entry<Integer, String>> set = map.entrySet();

        Iterator<Map.Entry<Integer, String>> itr = set.iterator();
        while (itr.hasNext()) {
            Map.Entry e = itr.next(); // no need to typecast
            System.out.println(e.getKey() + " " + e.getValue());
        }

    }
}