Rumah > Java > Bagaimanakah ini boleh dilakukan dalam generik Java?

Bagaimanakah ini boleh dilakukan dalam generik Java?

王林
Lepaskan: 2024-02-08 23:20:09
ke hadapan
964 orang telah melayarinya

Editor PHP Apple akan menjawab untuk anda: Dalam generik Java, soalan "Bagaimana ini boleh berlaku dalam generik Java sebenarnya?" Kerana generik Java membenarkan penggunaan kad bebas untuk mewakili jenis yang tidak ditentukan, seperti menggunakan "?" Apabila kita mentakrifkan kaedah generik atau kelas generik, kita boleh menggunakan kad bebas untuk mengehadkan jenis parameter atau mengembalikan jenis nilai untuk mencapai beberapa fungsi tertentu. Walaupun dalam beberapa kes, mungkin terdapat beberapa had disebabkan pemadaman jenis, dengan reka bentuk dan penggunaan yang munasabah, kami boleh mencapai banyak operasi yang kelihatan mustahil dalam generik Java.

Kandungan soalan

Saya baru perasan sesuatu yang sangat bertentangan dengan intuitif saya apabila ia berkaitan dengan Java Generics. Mari kita lihat kaedah ini:

public static <T> void inspect(T a, T b) { // ... }
Salin selepas log masuk

Panggilan berikut boleh dibuat:

inspect(new Integer(3), new String("What? How?"))
Salin selepas log masuk

Saya rasa sebaik sahaja jenis T diterbitkan, ia mesti konsisten, sama seperti dua rentetan atau dua integer. Ini tidak masuk akal, kerana jika saya mempunyai baris berikut dalam kaedah saya:

T tmp
Salin selepas log masuk

Apakah itu T?

Boleh sesiapa jelaskan?

Penyelesaian

Hasil utama adalah IntegerString都是从Serializedtercapai.

Jadi kod anda sama dengan:

public static <T extends Serializable> void inspect(T a, T b) {
    System.out.println(a + "_" + b);
}
Salin selepas log masuk

Jika ditukar kepada blow code, hanya sah dalam IntegerNumbersubkelas.

public static <T extends Number> void inspect(T a, T b) {
    System.out.println(a + "_" + b);
}
Salin selepas log masuk

Ini contoh yang lebih baik:

public class MyTest {

    @Test
    public void demo() {
        inspect(new FirstSon("a"), new SecondSon("b"));
    }

    public <T> void inspect(T a, T b) {
        System.out.println(a + "_" + b);
    }


    interface Parent {
    }

    static class FirstSon implements Parent {
        private String name;

        public FirstSon(String name) {
            this.name = name;
        }
    }

    static class SecondSon implements Parent {
        private String name;

        public SecondSon(String name) {
            this.name = name;
        }
    }
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimanakah ini boleh dilakukan dalam generik Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan