Rumah >Java >javaTutorial >Apakah extends T dan super T dalam Java?

Apakah extends T dan super T dalam Java?

PHPz
PHPzke hadapan
2023-05-09 11:19:171321semak imbas

? jenis kad bebas

  • 9d2765459de79669203dc2fefe6ee69e 🎜 >

  • 117c5a0bdb71ea9a9d0c2b99b03abe3e mewakili jenis batas bawah (dipanggil kelayakan jenis super dalam Java Core), menunjukkan bahawa jenis parameter ialah jenis super (jenis induk) jenis ini, sehingga Objek; 🎜>
  • Upper bound79b5bf10e99a4c29a6629605eb7342c1 bermaksud "senarai dengan mana-mana jenis yang diwarisi daripada Anak" , pengkompil tidak boleh menentukan jenis yang dipegang oleh Senarai, jadi ia tidak boleh menambah objek dengan selamat. Anda boleh menambah null kerana null boleh mewakili sebarang jenis. Jadi kaedah tambah Senarai tidak boleh menambah sebarang elemen bermakna, tetapi ia boleh menerima tugasan Senarai subjenis sedia ada.

    Anda boleh cuba melakukan ini:

    List<? extends Father> list = new LinkedList<Son>();
    list.add(new Son());

    Walaupun anda menentukan jenis Son, anda tidak boleh menambah objek Son menggunakan kaedah tambah. Mengapakah kelas Bapa dan subkelas kelas Bapa tidak boleh ditambahkan pada senarai

    Mari kita analisanya.

    Senarai8accd8a1ce888f6469952d6a43b744c5 bermakna had atas ialah Bapa, dan tugasan berikut adalah sah

       List<? extends Father> list1 = new ArrayList<Father>();
       List<? extends Father> list2 = new ArrayList<Son>();
       List<? extends Father> list3 = new ArrayList<LeiFeng>();

    Jika Senaraib71257a79456ff8c972da28a72489888 dan parameter jenis ialah kepada pengkompil, semua T mewakili jenis yang sama. Contohnya, dalam kaedah generik berikut, ketiga-tiga T semuanya merujuk kepada jenis yang sama, sama ada String atau Integer.
  • public <T> List<T> fill(T... t);
  • Tetapi watak kad bebas 6b3d0130bba23ae47fe2b8e8cddf0195 tidak mempunyai kekangan seperti itu6b3d0130bba23ae47fe2b8e8cddf0195

    Jadi kesilapan di sini ialah tiada apa yang boleh dimasukkan ke dalam Senaraifb66bbac87ef61245d34fda7a6295245 tetapi borang ini masih sangat berguna Walaupun kaedah tambah tidak boleh digunakan, Musim boleh menentukan jenis yang berbeza semasa permulaan. Sebagai contoh:

    List<? extends Father> list1 = getFatherList();//getFatherList方法会返回一个Father的子类的list

    Selain itu, memandangkan kami telah memastikan bahawa apa yang disimpan dalam Senarai ialah kelas Bapa atau salah satu subkelasnya, anda boleh menggunakan kaedah get untuk mendapatkan nilai secara terus:
  • List<? extends Father> list1 = new ArrayList<>();
    Father father = list1.get(0);//读取出来的东西只能存放在Father或它的基类里。
    Object object = list1.get(0);//读取出来的东西只能存放在Father或它的基类里。
    Human human = list1.get(0);//读取出来的东西只能存放在Father或它的基类里。
    Son son = (Son)list1.get(0);
Lower Bound< ;? super T> tidak menjejaskan storan masuk, tetapi pengambilan keluar hanya boleh diletakkan dalam objek Object

Sempadan bawah diisytiharkan dengan super, menunjukkan bahawa jenis parameter mungkin yang ditentukan jenis, atau jenis ini Jenis ibu bapa, sehingga Objek.

//super只能添加Father和Father的子类,不能添加Father的父类,读取出来的东西只能存放在Object类里
List<? super Father> list = new ArrayList<>();
list.add(new Father());
list.add(new Human());//compile error 
list.add(new Son());
Father person1 = list.get(0);//compile error 
Son son = list.get(0);//compile error 
Object object1 = list.get(0);

Oleh kerana sempadan bawah menentukan had bawah kebutiran minimum elemen, ia sebenarnya melonggarkan kawalan jenis elemen bekas. Memandangkan elemen itu ialah kelas asas Bapa, ia boleh disimpan dalam butiran yang lebih kecil daripada Bapa. Atas sebab keselamatan jenis, kita boleh menambah objek Bapa atau mana-mana subkelasnya (seperti Son Walau bagaimanapun, kerana pengkompil tidak mengetahui superclass Bapa kandungan Senarai itu, ia tidak dibenarkan untuk menambah mana-mana superclass tertentu). . Kelas (seperti Manusia). Dan apabila kita membacanya, pengkompil hanya boleh mengembalikan objek Objek tanpa mengetahui jenisnya, kerana Objek ialah kelas nenek moyang muktamad bagi mana-mana kelas Java. Tetapi dalam kes ini, semua jenis maklumat elemen hilang.

Prinsip PECS

Akhir sekali, mari kita lihat apakah prinsip PECS (Producer Extends Consumer Super) yang sudah difahami dengan baik:

Baca dengan kerap Untuk kandungan, adalah sesuai untuk menggunakan sempadan atas Extends.

Bagi yang kerap menyelitkannya, Nether Super sesuai.

Atas ialah kandungan terperinci Apakah extends T dan super T dalam Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam