Wildcard
- Java kursu
- Orta seviye
- Ders 85/116
- 5 dk
? extends T ve ? super T joker türlerini öğrenirsin.
Wildcard türleri
Generic türlerde wildcard ? ile joker kullanılır. Üç türü vardır: <?> bilinmeyen tür, <? extends T> T ve alt türleri (üst sınır), <? super T> T ve üst türleri (alt sınır).
Örnek: static double sum(List<? extends Number> nums) metodu List<Integer>, List<Double> gibi tüm Number alt türü listeleri kabul eder. Wildcard, generic koleksiyonları esnek kullanmanın anahtarıdır; kovaryans ve kontravaryans sağlar.
PECS ilkesi
Wildcard seçimi için PECS ilkesi yararlıdır: Producer Extends, Consumer Super. Bir liste üreticiyse (veri okuyorsan) ? extends T, tüketiciyse (veri yazıyorsan) ? super T kullanılır.
Örneğin sum(List<? extends Number>) listeden sayı okur, yani üreticidir. addNumbers(List<? super Integer>) listeye Integer ekler, yani tüketicidir. Her iki yönü de destekleyen bir parametre generic metot <T> ile yazılır.
Uygulama sum wildcard metodunu yaz
static double sum(List<? extends Number> nums) metodunu tanımla. Gövdede for (Number n : nums) total += n.doubleValue(); ile topla ve return total; ile döndür. main içinde List<Integer> ints = Arrays.asList(1, 2, 3); ile bir liste oluştur ve System.out.println(sum(ints)); ile yazdır.
Başlangıç kodu
import java.util.List;
import java.util.Arrays;
// sum metodunu tanımla: List<? extends Number>
// main: sum çağrısı ve printlnÖrnek çözüm
import java.util.List;
import java.util.Arrays;
public class Main {
static double sum(List<? extends Number> nums) {
double total = 0;
for (Number n : nums) {
total += n.doubleValue();
}
return total;
}
public static void main(String[] args) {
List<Integer> ints = Arrays.asList(1, 2, 3);
System.out.println(sum(ints));
}
}Beklenen çıktı
6.0
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 List<? extends Number> neyi kabul eder?
- Yalnızca List<Number>
- List<Integer> ve List<Double> gibi Number alt türlerini
- Yalnızca List<Object> Doğru cevap
- Herhangi bir List türünü
Açıklama: ? extends Number, Number ve alt türlerinin listelerini kabul eder.
2 Wildcard kavramlarını eşleştir
| Kavram | Anlamı |
|---|---|
? extends T |
Üretken (covariant) |
? super T |
Tüketici (contravariant) |
? |
Bilinmeyen tür |
extends |
Üst sınır anahtar kelimesi |
3 Wildcard parametreyi tamamla
static double sum(List____ nums) {
double total = 0;
return total;
}
static double sum(List<? extends Number> nums) {
double total = 0;
return total;
}
Açıklama: <? extends Number> Number alt türlerinin listelerini kabul eder.