CodeBlanks Logo Icon CodeBlanks

Wildcard

? 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

Main.java
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

Main.java
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

Soru
static double sum(List____ nums) {
    double total = 0;
    return total;
}
Cevap
static double sum(List<? extends Number> nums) {
    double total = 0;
    return total;
}

Açıklama: <? extends Number> Number alt türlerinin listelerini kabul eder.

Orta seviye bölümündeki tüm dersler