0Pricing
Java Academy · Ders

Üst Sınırlandırılmış Joker Türler

Üreticiler için ? extends T

Üst Sınırlandırılmış Joker Türler, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 1. 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.

Jenerikler Değişmezdir

Java'da jenerikler değişmezdir. Bir List<Integer>, Integer bir Number türü olsa da bir List<Number> değildir.

Bu durum yeni başlayanları şaşırtır, ancak tür sisteminin sağlam kalmasını sağlar. Joker türleri bu kısıtlamayı güvenli biçimde gevşetir.

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> ints = List.of(1, 2, 3);
        // List<Number> nums = ints; // would NOT compile
        System.out.println("List<Integer> is not List<Number>");
        System.out.println(ints);
    }
}

Üst Sınırlandırılmış Joker Türü

? extends T, üst sınırlandırılmış bir joker türüdür. T olan veya T'nin alt türü olan bilinmeyen bir tür anlamına gelir.

List<? extends Number>; List<Integer>, List<Double> veya List<Number> türündeki bir listeyi ifade edebilir.

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<? extends Number> a = List.of(1, 2, 3);
        List<? extends Number> b = List.of(1.5, 2.5);
        System.out.println(a.get(0));
        System.out.println(b.get(0));
    }
}

Bir Üreticiden Okuma

? extends Number ile öğeleri güvenle Number olarak okuyabilirsiniz.

Gerçek öğe türü ne olursa olsun, bunun en azından bir sayı olduğu garanti edilir; bu nedenle okuma tür açısından güvenlidir.

import java.util.List;

public class Main {
    static double sum(List<? extends Number> list) {
        double total = 0;
        for (Number n : list) total += n.doubleValue();
        return total;
    }
    public static void main(String[] args) {
        System.out.println(sum(List.of(1, 2, 3)));
        System.out.println(sum(List.of(1.5, 2.5)));
    }
}

Üzerine Yazamazsınız

İşin püf noktası şudur: ? extends Number listesine öğe ekleyemezsiniz (null dışında).

Derleyici, öğelerin tam türünü bilmez. Bu liste bir List<Integer> olabilir; dolayısıyla bir Double eklemek güvenli olmaz.

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

public class Main {
    public static void main(String[] args) {
        List<? extends Number> list = new ArrayList<Integer>();
        // list.add(1);   // does NOT compile
        // list.add(1.5); // does NOT compile
        System.out.println("Cannot add to ? extends Number");
        System.out.println("size = " + list.size());
    }
}

Yazmaya Neden İzin Verilmez

Buna izin verildiğini düşünün. Bir List<Integer> listesini List<? extends Number> olarak aktarabilir ve ardından bir Double ekleyebilirdiniz.

Daha sonra listeyi List<Integer> olarak okuyan kod bir ClassCastException alırdı. Derleyici, yazma işlemlerini yasaklayarak bunu önler.

import java.util.List;

public class Main {
    public static void main(String[] args) {
        // Conceptual: this is why add is blocked
        System.out.println("Writing a Double into a List<Integer> would corrupt it");
        System.out.println("so ? extends bans all adds");
    }
}

Üretici Kullanım Durumu

Bir yöntem sizin için yalnızca değer üretiyor (değerleri okuyarak alıyorsa) ? extends T kullanın.

Bir kaynak koleksiyonundaki öğeleri dışarıya kopyalayan yöntem bunun mükemmel bir örneğidir.

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

public class Main {
    static List<Number> copyOut(List<? extends Number> source) {
        List<Number> dest = new ArrayList<>();
        for (Number n : source) dest.add(n);
        return dest;
    }
    public static void main(String[] args) {
        System.out.println(copyOut(List.of(1, 2, 3)));
    }
}

Sınırlandırılmış Tür Parametreleri ve Joker Karakterler

<T extends Number> (sınırlandırılmış bir tür parametresi) ile ? extends Number (bir joker karakter) kavramlarını karıştırmayın.

  • Tür parametresi: Yöntem genelinde kullanılmak üzere türü adlandırır.
  • Joker karakter: Adlandırmanız gerekmediğinde kullanılan, adı olmayan bilinmeyen bir alt türdür.
import java.util.List;

public class Main {
    static <T extends Number> T first(List<T> list) { return list.get(0); }
    public static void main(String[] args) {
        Integer i = first(List.of(10, 20));
        System.out.println(i);
    }
}

Birden Çok Sınır

Bir tür parametresi, & kullanılarak <T extends Number & Comparable<T>> örneğindeki gibi birden çok sınıra sahip olabilir.

Joker karakterler yalnızca tek bir üst sınırı destekler; bu nedenle birden çok sınır için adlandırılmış bir tür parametresi gerekir.

import java.util.List;

public class Main {
    static <T extends Number & Comparable<T>> T max(List<T> list) {
        T best = list.get(0);
        for (T t : list) if (t.compareTo(best) > 0) best = t;
        return best;
    }
    public static void main(String[] args) {
        System.out.println(max(List.of(3, 9, 1, 7)));
    }
}

Collections.max ile Joker Karakterler

JDK, üst sınırları yaygın biçimde kullanır. Örneğin salt okunur bir koleksiyonu toplamak veya taramak için.

Burada üretici olarak türlendirilmiş bir listenin en büyük öğesini buluyoruz.

import java.util.List;

public class Main {
    static double largest(List<? extends Number> nums) {
        double max = Double.NEGATIVE_INFINITY;
        for (Number n : nums) max = Math.max(max, n.doubleValue());
        return max;
    }
    public static void main(String[] args) {
        System.out.println(largest(List.of(4, 2, 9, 1)));
        System.out.println(largest(List.of(0.5, 9.9, 3.3)));
    }
}

Yazılabilen Tek Değer null'dur

? extends T koleksiyonuna ekleyebileceğiniz tek şey null değeridir; çünkü null, herhangi bir başvuru türüne atanabilir.

Bu nadiren kullanışlıdır; ancak add işleminin neden tamamen yasaklanmadığını, yalnızca pratikte kullanılamaz olduğunu açıklar.

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

public class Main {
    public static void main(String[] args) {
        List<? extends Number> list = new ArrayList<Number>();
        // Only null is assignable; demonstrated conceptually
        System.out.println("Only null could be added; we avoid that");
        System.out.println("size = " + list.size());
    }
}

Object Olarak Okumak Her Zaman Çalışır

Her tür Object'i genişlettiği için herhangi bir joker karakterli listenin öğelerini her zaman Object olarak okuyabilirsiniz.

Üst sınır Number olduğunda, öğeleri doğrudan Number olarak okuma avantajını da elde edersiniz.

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<? extends Number> nums = List.of(1, 2.0, 3L);
        for (Object o : nums) System.out.println(o.getClass().getSimpleName());
    }
}

Kısa Kontrol

Üst sınırları anlayıp anlamadığınızı sınayın.

Özet

Üst sınırlı joker karakterleri öğrendiniz:

  • ? extends T, T'nin bilinmeyen bir alt türü anlamına gelir.
  • Öğeleri T olarak okuyabilirsiniz (üretici).
  • null olmayan öğeleri ekleyemezsiniz.
  • Genel türler değişmezdir; joker karakterler bu kuralı güvenli biçimde esnetir.

Sırada bunun ayna görüntüsü olan alt sınırlı joker karakterler var.

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<? extends Number> nums = List.of(1, 2, 3);
        System.out.println("Upper bound recap: read " + nums.get(0));
    }
}

Sıkça Sorulan Sorular

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

Evet — “Üst 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.

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

Üreticiler için ? extends 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 1. dersidir.

“Üst 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