<?>В Java
<?> называется неограниченным wildcard. Он обозначает, что параметр типа может быть любым, то есть неизвестным на этапе компиляции. Это удобно, когда метод или класс работают с обобщёнными типами, но конкретный тип элемента не важен.Например, выражение
List<?> означает список, элементы которого могут быть любого типа. Такой подход позволяет писать более универсальный и гибкий код, но при этом накладывает ограничения: мы не можем добавлять новые элементы в коллекцию, поскольку компилятор не знает конкретный тип элементов, чтобы обеспечить безопасность типов.
import java.util.List;
public class WildcardExample {
public static void printList(List<?> list) {
for (Object element : list) { // Элементы можно читать как Object
System.out.println(element);
}
}
public static void main(String[] args) {
List<Integer> intList = List.of(1, 2, 3);
List<String> strList = List.of("A", "B", "C");
printList(intList); // Вывод: 1 2 3
printList(strList); // Вывод: A B C
}
}
Здесь
List<?> позволяет передавать любой тип списка, но мы можем безопасно читать только как Object.
public static void addElement(List<?> list) {
// list.add("Hello"); // Ошибка компиляции!
}
#java #wildcard
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18❤1🔥1
extends (ограничение сверху)Если мы хотим работать только с числами (
Number и его потомками), можно использовать ? extends Number:
import java.util.List;
public class WildcardExample {
public static double sumNumbers(List<? extends Number> list) {
double sum = 0;
for (Number num : list) {
sum += num.doubleValue();
}
return sum;
}
public static void main(String[] args) {
List<Integer> intList = List.of(1, 2, 3);
List<Double> doubleList = List.of(1.1, 2.2, 3.3);
System.out.println(sumNumbers(intList)); // Вывод: 6.0
System.out.println(sumNumbers(doubleList)); // Вывод: 6.6
}
}
🔹
? extends Number означает, что list может быть списком любого подкласса Number (Integer, Double, Float и т. д.).🔹 Это позволяет безопасно читать значения, но не добавлять новые (аналогично
<?>).#java #wildcard
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤1
super (ограничение снизу)Иногда нужно работать с базовыми типами (например, добавлять в
List<? super Integer> только Integer и его предков):
import java.util.List;
import java.util.ArrayList;
public class WildcardExample {
public static void addNumbers(List<? super Integer> list) {
list.add(10);
list.add(20);
}
public static void main(String[] args) {
List<Number> numberList = new ArrayList<>();
addNumbers(numberList);
System.out.println(numberList); // Вывод: [10, 20]
}
}
🔹
? super Integer означает, что list может быть списком Integer или его родительских классов (Number, Object).🔹 Это позволяет безопасно добавлять
Integer, но при чтении придется использовать Object.#java #wildcard
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤1