У Java Generics символи підстановки використовуються, коли ви не знаєте точного типу. Вони дозволяють писати гнучкий і багаторазово використовуваний код. Символ підстановки представлений символом ? (знак питання). Символи підстановки в основному використовуються в параметрах методів для безпечного прийняття різних загальних типів.
Типи символів підстановки в Java
1. Символи підстановки з верхньою межею
Ці символи підстановки можна використовувати, коли ви хочете послабити обмеження на змінну. Наприклад, ви хочете написати метод, який працює на List< Integer >Список< Double >і Список< Number >це можна зробити за допомогою символу підстановки з верхньою межею.
Щоб оголосити символ узагальнення з верхньою межею, використовуйте символ узагальнення ('?'), після якого йде ключове слово extends, а потім його верхня межа.
public static void add(List extends Number>список)
множення матриці в c
Реалізація:
Javaimport java.util.Arrays; import java.util.List; class WildcardDemo { public static void main(String[] args) { // Upper Bounded Integer List List<Integer> list1 = Arrays.asList(4 5 6 7); System.out.println('Total sum is:' + sum(list1)); // Double list List<Double> list2 = Arrays.asList(4.1 5.1 6.1); System.out.print('Total sum is:' + sum(list2)); } private static double sum(List extends Number> list) { double sum = 0.0; for (Number i : list) { sum += i.doubleValue(); } return sum; } }
Вихід
Total sum is:22.0 Total sum is:15.299999999999999
Пояснення: У наведеній вище програмі list1 містить значення Integer, а list2 містить значення Double. Обидва передаються до методу суми, який використовує символ підстановки extends Number>. Це означає, що він може прийняти будь-який список типу, який є підкласом Number, наприклад Integer або Double.
2. Символи підстановки з нижньою межею
Він виражається за допомогою символу узагальнення ('?'), після якого йде ключове слово super, а потім його нижня межа: super A>.
дата використання java
Синтаксис: Тип колекції super A>
Реалізація:
Javaimport java.util.Arrays; import java.util.List; class WildcardDemo { public static void main(String[] args) { // Lower Bounded Integer List List<Integer> list1 = Arrays.asList(4 5 6 7); // Integer list object is being passed printOnlyIntegerClassorSuperClass(list1); // Number list List<Number> list2 = Arrays.asList(4 5 6 7); // Integer list object is being passed printOnlyIntegerClassorSuperClass(list2); } public static void printOnlyIntegerClassorSuperClass( List super Integer> list) { System.out.println(list); } }
Вихід
[4 5 6 7] [4 5 6 7]
Пояснення: Тут метод printOnlyIntegerClassorSuperClass приймає лише Integer або його суперкласи (наприклад, Number). Якщо ви намагаєтеся передати список Double, це видає помилку під час компіляції, оскільки Double не є суперкласом Integer.
img css align
Примітка: Використовуйте розширений символ узагальнення, коли ви хочете отримати значення зі структури, і символ підстановки, коли ви розміщуєте значення в структурі. Не використовуйте символ підстановки, коли ви отримуєте та розміщуєте значення в структурі. Ви можете вказати верхню межу для символу узагальнення або ви можете вказати нижню межу, але ви не можете вказати обидва.
3. Необмежений символ підстановки
Цей тип символу узагальнення вказується за допомогою символу узагальнення (?), наприклад List. Це називається списком невідомих типів. Вони корисні в таких випадках:
- Під час написання методу, який можна використовувати за допомогою функціональних можливостей, наданих у класі Object.
- Коли код використовує методи в загальному класі, який не залежить від параметра типу
Реалізація:
Javaimport java.util.Arrays; import java.util.List; class unboundedwildcardemo { public static void main(String[] args) { // Integer List List<Integer> list1 = Arrays.asList(1 2 3); // Double list List<Double> list2 = Arrays.asList(1.1 2.2 3.3); printlist(list1); printlist(list2); } private static void printlist(List> list) { System.out.println(list); } }
Вихід
[1 2 3] [1.1 2.2 3.3]