Java
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.
Örnek çözümü göster
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));
}
}
Kendini test et
-
List<? extends Number> neyi kabul eder?
- Yalnızca List<Number>
- List<Integer> ve List<Double> gibi Number alt türlerini
- Yalnızca List<Object>
- Herhangi bir List türünü
Cevabı göster
Yalnızca List<Object> — ? extends Number, Number ve alt türlerinin listelerini kabul eder.
-
Wildcard kavramlarını eşleştir
- ? extends T
- Üretken (covariant)
- ? super T
- Tüketici (contravariant)
- ?
- Bilinmeyen tür
- extends
- Üst sınır anahtar kelimesi
-
Wildcard parametreyi tamamla
static double sum(List____ nums) {
double total = 0;
return total;
}
Cevabı göster
static double sum(List<? extends Number> nums) {
double total = 0;
return total;
}
Sıradaki ders: Type erasure