Java Generics - Hướng dẫn sử dụng ký tự đại diện

Các ký tự đại diện có thể được sử dụng theo ba cách:

  • Upper bound Wildcard-? mở rộng Loại.

  • Lower bound Wildcard-? siêu Loại.

  • Unbounded Wildcard -?

Để quyết định loại ký tự đại diện nào phù hợp nhất với điều kiện, trước tiên chúng ta hãy phân loại loại tham số được truyền cho một phương thức là inout tham số.

  • in variable- Một biến trong cung cấp dữ liệu cho mã. Ví dụ, sao chép (src, dest). Ở đây src hoạt động như trong biến là dữ liệu được sao chép.

  • out variable- Một biến out giữ dữ liệu được cập nhật bởi mã. Ví dụ, sao chép (src, dest). Ở đây đích hoạt động như trong biến có dữ liệu được sao chép.

Hướng dẫn về Ký tự đại diện.

  • Upper bound wildcard - Nếu một biến là in danh mục, sử dụng từ khóa mở rộng với ký tự đại diện.

  • Lower bound wildcard - Nếu một biến là out danh mục, sử dụng từ khóa siêu với ký tự đại diện.

  • Unbounded wildcard - Nếu một biến có thể được truy cập bằng phương thức lớp Object thì hãy sử dụng một ký tự đại diện không liên kết.

  • No wildcard - Nếu mã đang truy cập biến trong cả hai inout danh mục sau đó không sử dụng ký tự đại diện.

Thí dụ

Ví dụ sau minh họa các khái niệm đã đề cập ở trên.

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.List;

public class GenericsTester {

   //Upper bound wildcard
   //in category
   public static void deleteCat(List<? extends Cat> catList, Cat cat) {
      catList.remove(cat);
      System.out.println("Cat Removed");
   }

   //Lower bound wildcard
   //out category
   public static void addCat(List<? super RedCat> catList) {
      catList.add(new RedCat("Red Cat"));
      System.out.println("Cat Added");
   }

   //Unbounded wildcard
   //Using Object method toString()
   public static void printAll(List<?> list) {
      for (Object item : list)
         System.out.println(item + " ");
   }

   public static void main(String[] args) {

      List<Animal> animalList= new ArrayList<Animal>();
      List<RedCat> redCatList= new ArrayList<RedCat>();

      //add list of super class Animal of Cat class
      addCat(animalList);
      //add list of Cat class
      addCat(redCatList);  
      addCat(redCatList);  

      //print all animals
      printAll(animalList);
      printAll(redCatList);

      Cat cat = redCatList.get(0);
      //delete cat
      deleteCat(redCatList, cat);
      printAll(redCatList); 
   }
}

class Animal {
   String name;
   Animal(String name) { 
      this.name = name;
   }
   public String toString() { 
      return name;
   }
}

class Cat extends Animal { 
   Cat(String name) {
      super(name);
   }
}

class RedCat extends Cat {
   RedCat(String name) {
      super(name);
   }
}

class Dog extends Animal {
   Dog(String name) {
      super(name);
   }
}

Điều này sẽ tạo ra kết quả sau:

Cat Added
Cat Added
Cat Added
Red Cat 
Red Cat 
Red Cat 
Cat Removed
Red Cat