Java: Lớp generic

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Lớp generic cho phép lập trình viên Java chỉ định một tập hợp các kiểu liên quan với một khai báo lớp duy nhất. Một generic được tham số hóa trên các kiểu. Nó là một class hoặc interface generic.

Một generic là một cơ chế để chỉ định mối quan hệ kiểu giữa một kiểu thành phần và kiểu đối tượng của nó. Trong quá trình tạo các thể hiện lớp, kiểu cụ thể cho một tham số lớp sẽ được xác định. Vì vậy, loại thành phần được xác định bởi tham số lớp phụ thuộc vào một thể hiện cụ thể. Một mối quan hệ lớp con không thể được thiết lập giữa một lớp generic và các thể hiện của nó. Tính đa hình về thời gian chạy trên một lớp generic là không thể thực hiện được, do đó, các biến không thể được chỉ định bởi lớp generic.

Một khai báo lớp generic giống như một khai báo lớp non-generic. Tuy nhiên, trong khai báo lớp generic, tên lớp được theo sau bởi một phần tham số kiểu.

Cú pháp khai báo một lớp generic giống như lớp thông thường ngoại trừ việc trong dấu ngoặc nhọn (<>), các tham số kiểu được khai báo. Khai báo các tham số kiểu theo sau tên lớp. Các tham số kiểu giống như các biến và có thể có giá trị là kiểu lớp, kiểu interface hoặc bất kỳ biến kiểu nào khác ngoại trừ kiểu dữ liệu nguyên thủy. Khai báo lớp chẳng hạn như List<E> biểu thị một lớp có kiểu generic.

Một lớp generic cho phép một loạt các đối tượng thuộc bất kỳ kiểu nào được lưu trữ trong lớp generic và không đưa ra giả định nào về cấu trúc bên trong của các đối tượng đó. Tham số cho lớp generic (INTEGER trong ARRAY [INTEGER]) là lớp được đưa ra trong khai báo mảng và bị ràng buộc tại thời điểm biên dịch. Do đó, một lớp generic có thể tạo ra nhiều kiểu, một kiểu cho mỗi kiểu tham số, chẳng hạn như ARRAY [TREE], ARRAY [STRING], v.v. Các lớp generic có thể chấp nhận một hoặc nhiều tham số kiểu. Do đó, chúng được gọi là các lớp tham số hóa hoặc các kiểu tham số hóa. Phần tham số kiểu của một lớp generic có thể bao gồm một số tham số kiểu được phân tách bằng dấu phẩy.

Khai báo và khởi tạo lớp generic

Để tạo một thể hiện của lớp generic, từ khóa new được sử dụng cùng với tên lớp ngoại trừ đối số tham số kiểu được truyền giữa tên lớp và dấu ngoặc đơn. Đối số tham số kiểu được thay thế bằng kiểu thực khi một đối tượng được tạo từ một lớp. Một lớp generic được chia sẻ giữa tất cả các thể hiện của nó.

Cú pháp:

class NumberList <Element> {...}

Ví dụ sau thể hiện việc khai báo của một lớp generic.

public class NumberList<T> {
  private T obj;

  public void add(T val) {
    //. . .
  }

  public static void main(String[] args) {
    NumberList<String> listObj = new NumberList<String>();
    //. . .
  }
}

Ví dụ trên tạo ra một khai báo lớp kiểu generic với một biến kiểu là T và nó có thể được sử dụng ở bất kỳ đâu trong lớp. Để tham chiếu đến lớp generic này, một lệnh gọi kiểu generic được thực hiện thay thế T bằng một giá trị chẳng hạn như String.

Người dùng có thể chỉ định một biến kiểu là bất kỳ kiểu không nguyên thủy nào, có thể là bất kỳ kiểu lớp nào, bất kỳ kiểu mảng nào, bất kỳ kiểu interface nào hoặc thậm chí là một biến kiểu khác.

Thông thường, tên tham số kiểu là các chữ cái viết hoa, đơn. Sau đây là các tên tham số kiểu thường được sử dụng:

  • K - Key
  • T - Type
  • V - Value
  • N - Number
  • E - Element
  • S, U, V, v.v.

Ví dụ sau minh họa cách một lớp có thể được khai báo và khởi tạo.

import java.util.*;

class TestQueue <DataType> {
  private LinkedList<DataType> items = new LinkedList<DataType>();
  public void enqueue(DataType item) {
    items.addLast(item);
  }
  public DataType dequeue() {
    return items.removeFirst();
  }
  public boolean isEmpty() { return (items.size() == 0);
  }
  public static void main(String[] args) {
    TestQueue<String> testObj = new TestQueue<>();
    testObj.enqueue("Hello");
    testObj.enqueue("Java");
    System.out.println((String) testObj.dequeue());
  }
}

Trong Java SE 7 trở lên, các đối số kiểu bắt buộc có thể được thay thế để gọi hàm tạo của một lớp generic bằng một tập hợp rỗng các đối số kiểu (<>). Cặp dấu ngoặc nhọn (<>) được gọi là hình thoi. Điều quan trọng cần lưu ý là trình biên dịch phải xác định các đối số kiểu từ ngữ cảnh khi sử dụng tập hợp trống các đối số kiểu.

Ví dụ sau, một thể hiện của TestQueue sẽ chấp nhận String làm tham số kiểu.

TestQueue<String> testObj = new TestQueue<>();

Trong ví dụ trên, một lớp generic được tạo ra để thực hiện khái niệm hàng đợi và xếp hàng trên bất kỳ kiểu dữ liệu nào như Integer, String và Double. Biến kiểu hoặc tham số kiểu, <DataType>, được sử dụng cho kiểu đối số và kiểu trả về của hai phương thức. Tham số kiểu có thể có bất kỳ tên nào. Tham số kiểu có thể được so sánh với tham số chính thức trong chương trình con. Tên sẽ được thay thế bằng tên thực khi lớp sẽ được sử dụng để tạo một thể hiện. Ở đây, <DataType> đã được thay thế bằng String trong phương thức main() trong khi khởi tạo lớp. Hình sau hiển thị output.

output generic

Lưu ý - Để hiểu sự khác biệt giữa biến kiểu và một lớp thông thường hoặc tên interface, các tham số kiểu là các chữ cái viết hoa, đơn.

 
» Tiếp: Phương thức generic
« Trước: Tổng quan về Generics
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!