Учебники

Java Generics — Руководство по использованию подстановочных знаков

Подстановочные знаки можно использовать тремя способами:

  • Верхний предел Wildcard -? Тип расширяет.

  • Нижний предел подстановочный знак -? Супер Тип.

  • Неограниченный Wildcard -?

Верхний предел Wildcard -? Тип расширяет.

Нижний предел подстановочный знак -? Супер Тип.

Неограниченный Wildcard -?

Чтобы решить, какой тип подстановочного знака лучше всего соответствует условию, давайте сначала классифицируем тип параметров, передаваемых методу, как параметр in и out .

  • в переменной — переменная в предоставляет данные для кода. Например, копия (src, dest). Здесь src действует как переменная, являющаяся данными для копирования.

  • Переменная outпеременная out содержит данные, обновленные кодом. Например, копия (src, dest). Здесь dest действует как в переменной скопировав данные.

в переменной — переменная в предоставляет данные для кода. Например, копия (src, dest). Здесь src действует как переменная, являющаяся данными для копирования.

Переменная outпеременная out содержит данные, обновленные кодом. Например, копия (src, dest). Здесь dest действует как в переменной скопировав данные.

Руководство по подстановочным знакам.

  • Подстановочный знак с верхней границей — если переменная относится к категории, используйте ключевое слово extends с подстановочным знаком.

  • Подстановочный знак нижней границы — если переменная не относится к категории, используйте ключевое слово super с подстановочным знаком.

  • Неограниченный подстановочный знак — если к переменной можно получить доступ, используя метод класса Object, тогда используйте несвязанный подстановочный знак.

  • Без подстановочных знаков — если код обращается к переменной как в категории «как», так и вне ее, не используйте подстановочные знаки.

Подстановочный знак с верхней границей — если переменная относится к категории, используйте ключевое слово extends с подстановочным знаком.

Подстановочный знак нижней границы — если переменная не относится к категории, используйте ключевое слово super с подстановочным знаком.

Неограниченный подстановочный знак — если к переменной можно получить доступ, используя метод класса Object, тогда используйте несвязанный подстановочный знак.

Без подстановочных знаков — если код обращается к переменной как в категории «как», так и вне ее, не используйте подстановочные знаки.

пример

Следующий пример иллюстрирует вышеупомянутые понятия.

Live Demo

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);
   }
}

Это даст следующий результат —