0Pricing
Java Academy · Ders

Alt Sınırlandırılmış Joker Türler

Tüketiciler için ? super T

Alt Sınırlandırılmış Joker Türler, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

Alt Sınırlı Joker Karakter

? super T, alt sınırlı bir joker karakterdir. “T olan veya T'nin üst türlerinden biri olan bilinmeyen bir tür” anlamına gelir.

List<? super Integer>, bir List<Integer>, List<Number> veya List<Object> listesini ifade edebilir.

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<? super Integer> a = new ArrayList<Number>();
        List<? super Integer> b = new ArrayList<Object>();
        a.add(1);
        b.add(2);
        System.out.println(a + " " + b);
    }
}

Tüketiciye Yazmak

? super Integer ile herhangi bir Integer'ı (veya Integer'ın bir alt türünü) güvenle ekleyebilirsiniz.

Gerçek liste türü ne olursa olsun, liste en azından bir Integer üst türünün listesidir; dolayısıyla Integer her zaman sığar.

import java.util.ArrayList;
import java.util.List;

public class Main {
    static void addNumbers(List<? super Integer> dest) {
        for (int i = 1; i <= 3; i++) dest.add(i);
    }
    public static void main(String[] args) {
        List<Number> nums = new ArrayList<>();
        addNumbers(nums);
        System.out.println(nums);
    }
}

Okuma Size Object Verir

Ödünleşim şudur: ? super T listesinden okuma yaptığınızda derleyici, öğelerin T'nin bilinmeyen bir üst türü olduğunu bilir.

Okumalar için güvenli olan tek tür Object türüdür.

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<? super Integer> list = new ArrayList<Number>();
        list.add(10);
        Object o = list.get(0); // only Object is guaranteed
        // Integer i = list.get(0); // would NOT compile
        System.out.println(o);
    }
}

Okuma Neden Sınırlıdır

Bir List<? super Integer> aslında String'ler içeren bir List<Object> olabilir.

Bu nedenle bir okuma herhangi bir Object döndürebilir. Derleyici bir Integer garantisi veremez; dolayısıyla okumalar yalnızca Object sağlar.

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Object> raw = new ArrayList<>();
        raw.add("a string");
        List<? super Integer> view = raw; // legal: Object is a supertype of Integer
        view.add(5);
        System.out.println(view.get(0).getClass().getSimpleName());
    }
}

Tüketici Kullanım Durumu

Bir yöntem yalnızca değerleri tüketiyorsa (içeriye yazıyorsa) ? super T kullanın.

Hedef bir koleksiyonu dolduran yöntem bunun klasik örneğidir.

import java.util.ArrayList;
import java.util.List;

public class Main {
    static void fill(List<? super String> dest, int count) {
        for (int i = 0; i < count; i++) dest.add("item" + i);
    }
    public static void main(String[] args) {
        List<Object> objs = new ArrayList<>();
        fill(objs, 3);
        System.out.println(objs);
    }
}

Alt Türleri Eklemek de Çalışır

? super Number ile herhangi bir Number'ı veya alt türlerini ekleyebilirsiniz: Integer, Double, Long.

Alt sınır, listenin en az Number kabul etmesini garanti eder; dolayısıyla tüm alt türler sığar.

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<? super Number> list = new ArrayList<Object>();
        list.add(1);      // Integer
        list.add(2.5);    // Double
        list.add(3L);     // Long
        System.out.println(list);
    }
}

Collections.addAll Tarzı

JDK, hedefler için alt sınırları kullanır. Örneğin öğeleri bir hedefe aktaran genel bir yöntem.

import java.util.ArrayList;
import java.util.List;

public class Main {
    @SafeVarargs
    static <T> void addAll(List<? super T> dest, T... items) {
        for (T item : items) dest.add(item);
    }
    public static void main(String[] args) {
        List<Object> sink = new ArrayList<>();
        addAll(sink, "a", "b", "c");
        System.out.println(sink);
    }
}

super ile Karşılaştırıcı

Gerçek dünyadan bir kullanım: Comparator<? super T>, bir sıralama işleminin üst tür için yazılmış bir karşılaştırıcıyı kabul etmesini sağlar.

Herhangi bir Object'i toString ile karşılaştıran bir karşılaştırıcı, String listesini sıralayabilir.

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        Comparator<Object> byString = Comparator.comparing(Object::toString);
        List<String> names = new ArrayList<>(List.of("Charlie", "Alice", "Bob"));
        names.sort(byString); // List<String>.sort accepts Comparator<? super String>
        System.out.println(names);
    }
}

super ve extends Birbirinin Aynasıdır

İki joker karakter birbirinin tersidir:

  • ? extends T: T okunur, yazılamaz. Bir üreticidir.
  • ? super T: T yazılır, yalnızca Object okunur. Bir tüketicidir.

Bu simetri, sırada öğreneceğiniz PECS kuralının temelidir.

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<? super Integer> consumer = new ArrayList<Number>();
        consumer.add(1);
        System.out.println("consumer can write: " + consumer);
    }
}

Sınırlar Arasında Kopyalama

Bir copy yöntemi iki joker karakteri aynı anda gösterir: ? extends T üzerinden okunur, ? super T üzerine yazılır.

import java.util.ArrayList;
import java.util.List;

public class Main {
    static <T> void copy(List<? extends T> src, List<? super T> dest) {
        for (T t : src) dest.add(t);
    }
    public static void main(String[] args) {
        List<Integer> src = List.of(1, 2, 3);
        List<Number> dest = new ArrayList<>();
        copy(src, dest);
        System.out.println(dest);
    }
}

Joker Karakter Ne Zaman Kullanılmamalı

Bir yöntem hem T'yi okuyup hem yazıyorsa joker karakter kullanmayın. Kesin bir tür veya adlandırılmış bir tür parametresi kullanın.

Joker karakterler özellikle yalnızca okuma veya yalnızca yazma durumları için vardır.

import java.util.ArrayList;
import java.util.List;

public class Main {
    static <T> void swapFirstTwo(List<T> list) {
        T tmp = list.get(0);
        list.set(0, list.get(1));
        list.set(1, tmp);
    }
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(List.of("a", "b"));
        swapFirstTwo(list);
        System.out.println(list);
    }
}

Kısa Kontrol

Alt sınırları anlayıp anlamadığınızı sınayın.

Özet

Alt sınırlı joker karakterleri öğrendiniz:

  • ? super T, T'nin bilinmeyen bir üst türü anlamına gelir.
  • T'yi ve alt türlerini yazabilirsiniz (tüketici).
  • Okumalar yalnızca Object döndürür.
  • ? extends T kavramının tam tersidir.

Sırada ikisini birleştiren kural var: PECS.

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<? super Integer> list = new ArrayList<Number>();
        list.add(42);
        System.out.println("Lower bound recap: " + list);
    }
}

Sıkça Sorulan Sorular

“Alt Sınırlandırılmış Joker Türler” dersi ücretsiz mi?

Evet — “Alt Sınırlandırılmış Joker Türler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“Alt Sınırlandırılmış Joker Türler” dersinde ne öğreneceğim?

Tüketiciler için ? super T Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Alt Sınırlandırılmış Joker Türler” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Üst Sınırlandırılmış Joker Türler
  2. Alt Sınırlandırılmış Joker Türler
  3. PECS İlkesi
  4. API'lerde Joker Türler
← Java Academy Sayfasına Dön