Java | Фишки и трюки
7.21K subscribers
182 photos
29 videos
6 files
40 links
Java: примеры кода, интересные фишки и полезные трюки

Купить рекламу: https://telega.in/c/java_tips_and_tricks

✍️По всем вопросам: @Pascal4eg
Download Telegram
⌨️ Неограниченным wildcard <?>

В 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
👍181🔥1
⌨️ Wildcard. Использование с 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
👍101
⌨️ Wildcard. Использование с 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
👍91