Thứ Ba, 4 tháng 9, 2018

Java - Generics

Học lập trình Java Sẽ tốt hơn nếu chúng ta có thể viết một phương thức sắp xếp đơn lẻ có thể sắp xếp các phần tử trong một mảng Integer, một mảng String, hoặc một mảng của bất kỳ kiểu nào hỗ trợ sắp xếp thứ tự.

Học java 


Các phương thức chung của Java và các lớp chung cho phép các lập trình viên xác định, với một khai báo phương thức đơn, một tập các phương thức liên quan, hoặc với một khai báo lớp đơn, một tập các kiểu liên quan tương ứng.

Generics cũng cung cấp tính an toàn kiểu thời gian biên dịch cho phép các lập trình viên nắm bắt các kiểu không hợp lệ tại thời gian biên dịch.

Sử dụng khái niệm Java Generic, chúng ta có thể viết một phương thức chung để sắp xếp một mảng các đối tượng, sau đó gọi phương thức chung với các mảng Integer, mảng đôi, mảng String và vv để sắp xếp các phần tử mảng.

Phương pháp chung

Bạn có thể viết một khai báo phương thức chung chung có thể được gọi với các đối số của các kiểu khác nhau. Dựa trên các loại đối số được truyền cho phương thức chung, trình biên dịch xử lý từng phương thức gọi một cách thích hợp. Sau đây là các quy tắc để xác định Phương thức chung -

Tất cả các khai báo phương thức chung có một phần tham số kiểu được giới hạn bởi các dấu ngoặc nhọn (<và>) đứng trước kiểu trả về của phương thức (<E> trong ví dụ tiếp theo).

Mỗi phần tham số kiểu chứa một hoặc nhiều tham số kiểu được phân tách bằng dấu phẩy. Một tham số kiểu, còn được gọi là một biến kiểu, là một định danh chỉ định một tên kiểu chung.

Các tham số kiểu có thể được sử dụng để khai báo kiểu trả về và hoạt động như các trình giữ chỗ cho các kiểu đối số được truyền cho phương thức generic, được gọi là các đối số kiểu thực tế.

Cơ thể của một phương thức chung được khai báo giống như của bất kỳ phương thức nào khác. Lưu ý rằng các tham số kiểu có thể chỉ đại diện cho các kiểu tham chiếu, không phải kiểu nguyên thủy (như int, double và char).

Thí dụ

Ví dụ sau minh họa cách chúng ta có thể in một mảng kiểu khác nhau bằng cách sử dụng một phương thức chung chung

public class GenericMethodTest {
   // generic method printArray
   public static < E > void printArray( E[] inputArray ) {
      // Display array elements
      for(E element : inputArray) {
         System.out.printf("%s ", element);
      }
      System.out.println();
   }

   public static void main(String args[]) {
      // Create arrays of Integer, Double and Character
      Integer[] intArray = { 1, 2, 3, 4, 5 };
      Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
      Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };

      System.out.println("Array integerArray contains:");
      printArray(intArray);   // pass an Integer array

      System.out.println("\nArray doubleArray contains:");
      printArray(doubleArray);   // pass a Double array

      System.out.println("\nArray characterArray contains:");
      printArray(charArray);   // pass a Character array
   }
}
Điều này sẽ tạo ra kết quả sau

Đầu ra
Array integerArray contains:
1 2 3 4 5 

Array doubleArray contains:
1.1 2.2 3.3 4.4 

Array characterArray contains:
H E L L O

Các tham số kiểu bị ràng buộc

Có thể có những lúc bạn sẽ muốn hạn chế các loại được phép chuyển cho tham số kiểu. Ví dụ, một phương thức hoạt động trên các số có thể chỉ muốn chấp nhận các cá thể của Number hoặc các lớp con của nó. Đây là những thông số kiểu được bao bọc cho.

Để khai báo một tham số kiểu bounded, hãy liệt kê tên của tham số kiểu, theo sau là từ khóa mở rộng, tiếp theo là giới hạn trên của nó.

Thí dụ

Ví dụ sau minh họa cách mở rộng được sử dụng theo nghĩa chung có nghĩa là "mở rộng" (như trong các lớp) hoặc "thực hiện" (như trong các giao diện). Ví dụ này là phương thức Generic để trả về lớn nhất trong số ba đối tượng Comparable
public class MaximumTest {
   // determines the largest of three Comparable objects
   
   public static <T extends Comparable<T>> T maximum(T x, T y, T z) {
      T max = x;   // assume x is initially the largest
      
      if(y.compareTo(max) > 0) {
         max = y;   // y is the largest so far
      }
      
      if(z.compareTo(max) > 0) {
         max = z;   // z is the largest now                 
      }
      return max;   // returns the largest object   
   }
   
   public static void main(String args[]) {
      System.out.printf("Max of %d, %d and %d is %d\n\n", 
         3, 4, 5, maximum( 3, 4, 5 ));

      System.out.printf("Max of %.1f,%.1f and %.1f is %.1f\n\n",
         6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ));

      System.out.printf("Max of %s, %s and %s is %s\n","pear",
         "apple", "orange", maximum("pear", "apple", "orange"));
   }
}
Điều này sẽ tạo ra kết quả sau

Đầu ra

Max of 3, 4 and 5 is 5

Max of 6.6,8.8 and 7.7 is 8.8

Max of pear, apple and orange is pear

Lớp học chung

Một khai báo lớp chung chung trông giống như một khai báo lớp không chung chung, ngoại trừ tên lớp được theo sau bởi một phần tham số kiểu.

Như với các phương thức chung, phần tham số kiểu của một lớp chung có thể có một hoặc nhiều tham số kiểu được phân tách bằng dấu phẩy. Các lớp này được gọi là các lớp được tham số hóa hoặc các kiểu được tham số hóa bởi vì chúng chấp nhận một hoặc nhiều tham số.

Thí dụ

Ví dụ sau minh họa cách chúng ta có thể định nghĩa một lớp chung chung
public class Box<T> {
   private T t;

   public void add(T t) {
      this.t = t;
   }

   public T get() {
      return t;
   }

   public static void main(String[] args) {
      Box<Integer> integerBox = new Box<Integer>();
      Box<String> stringBox = new Box<String>();
    
      integerBox.add(new Integer(10));
      stringBox.add(new String("Hello World"));

      System.out.printf("Integer Value :%d\n\n", integerBox.get());
      System.out.printf("String Value :%s\n", stringBox.get());
   }
}
Điều này sẽ tạo ra kết quả sau

Đầu ra
Integer Value :10
String Value :Hello World

Không có nhận xét nào:

Đăng nhận xét

Lập trình Java - Ngoại lệ

Một ngoại lệ (hoặc sự kiện đặc biệt) là một vấn đề phát sinh trong quá trình thực hiện chương trình. Khi xảy ra Ngoại lệ , luồng bình thường...