Pertanyaan Java generics void / Void types


Saya sedang mengimplementasikan ResponseHandler untuk paket HttpClient apache, seperti:

new ResponseHandler<int>() {
    public int handleResponse(...) {
        // ... code ...
        return 0;
    }
}

tapi saya ingin untuk itu handleResponse berfungsi untuk mengembalikan apa-apa, i.e. void. Apakah ini mungkin? Berikut ini tidak dikompilasi, sejak void bukan tipe Java yang valid:

new ResponseHandler<void>() {
        public void handleResponse(...) {
            // ... code ...
        }
}

Saya kira saya bisa menggantikannya void dengan Void untuk mengembalikan a Void objek, tapi itu tidak benar-benar apa yang saya inginkan. Pertanyaan: apakah mungkin untuk mengatur situasi panggilan balik ini sedemikian rupa sehingga saya dapat kembali void dari handleResponse?


58
2018-04-06 14:53


asal


Jawaban:


Generik hanya menangani kelas objek. tipe kekosongan dan primitif tidak didukung oleh Generik dan Anda tidak dapat menggunakan ini sebagai tipe parameter. Anda harus menggunakan Void sebagai gantinya.

Bisakah Anda mengatakan mengapa Anda tidak ingin menggunakannya Void?


47
2018-04-06 14:58



Itu Void jenis dibuat untuk situasi yang tepat ini: untuk membuat metode dengan tipe pengembalian umum di mana subtipe dapat "batal". Void dirancang sedemikian rupa sehingga tidak ada objek jenis itu yang dapat dibuat. Demikianlah metode tipe Void akan selalu kembali null (atau lengkap secara tidak normal), yang hampir tidak ada apa pun yang akan Anda dapatkan. Anda harus meletakkannya return null dalam metode ini, tetapi ini seharusnya hanya merupakan ketidaknyamanan kecil.

Singkatnya: Gunakan Void.


67
2018-04-06 15:47



Kapan Anda harus kembali java.lang.Void, kembalilah null.


3
2018-01-04 19:59



Sayangnya itu tidak mungkin. Anda dapat mengatur kode untuk kembali Void seperti yang Anda katakan, namun Anda tidak pernah dapat instanciate a Void jadi Anda tidak bisa benar-benar menulis fungsi yang sesuai dengan spesifikasi ini.

Anggap saja sebagai: Fungsi generik mengatakan "fungsi ini mengembalikan sesuatu, dari tipe X", dan Anda dapat menentukan X tetapi Anda tidak dapat mengubah kalimat menjadi "fungsi ini tidak menghasilkan apa-apa". (Saya tidak yakin apakah saya setuju dengan semantik ini, tapi begitulah adanya.)

Dalam hal ini, apa yang selalu saya lakukan, hanyalah membuat fungsi tipe kembalian Object, dan nyatanya selalu kembali null.


1
2018-04-06 14:57



Anda tidak bisa memiliki primitif dalam generik int sebenarnya adalah integer. Objeknya Void analog dengan kata kunci void untuk obat generik.


1
2018-04-06 14:57



Implementasi java.lang.Void di Jawa ini berbicara untuk dirinya sendiri. Juga, saya menulis artikel yang mengikat ini ke dalam generik. Butuh sedikit pemikiran sebelum saya mulai memahami ini: http://www.siteconsortium.com/h/D00006.php. Perhatikan TYPE = Class.getPrimitiveClass ("void");

paket java.lang;

public final class Void {

    public static final Class<Void> TYPE = Class.getPrimitiveClass("void");

    private Void() {}
}

-3
2017-12-27 18:08