bagaimana mengimplementasikan metode yang memiliki parameter yang sama tetapi tanda tangannya berbeda

Saya harus mengimplementasikan fungsi yang memiliki fungsi yang sama tetapi tipe pengembaliannya berbeda dan parameter fungsinya juga sama.

public static List<Base> remove(List<Subclass> arrange ) {
    List<Base>update = new ArrayList<>();

    for(Subclass arranging : arrange){
        //For-loop body here
    }
    return update;
}

public static List<Subclass> remove(List<Subclass> arrange ) {
    List<Subclass>update = new ArrayList<>();

    for(Subclass arranging : arrange){
        //For-loop body here
    }
    return update;
}  

Di sini Base dan Subclass adalah kelas yang sudah ditentukan.

Hanya satu metode yang harus ada bernama remove karena fungsinya sama sehingga akan terjadi redundansi jika saya menerapkan metode yang sama dua kali hanya karena tipe data yang berbeda


person ROHIT PATHAK    schedule 21.05.2019    source sumber
comment
Anda dapat menggunakan satu metode dengan obat generik jika satu-satunya perbedaan adalah tipe pengembalian.   -  person second    schedule 21.05.2019
comment
Kemungkinan duplikat Cara agar metode Java mengembalikan generik daftar jenis apa pun?   -  person Frakcool    schedule 21.05.2019
comment
Hal ini tidak mungkin dilakukan jika mereka memiliki nama yang sama. Bagaimana kompiler dapat mengetahui mana yang harus dieksekusi ketika Anda memanggil hapus(Daftar)? Yang mengembalikan Daftar‹Base› atau Daftar‹Subkelas›?   -  person burm87    schedule 21.05.2019
comment
Java tidak mendukung kelebihan metode berbasis tipe kembalian. Ganti nama metode dan panggil metode yang lain, jika Anda ingin menghindari redundansi. tautan   -  person Sumit Bhardwaj    schedule 21.05.2019
comment
Anda dapat membuat panggilan metode umum hapus(Daftar‹T› atur) dan panggil dari kedua kelas.   -  person dassum    schedule 21.05.2019
comment
Simpan saja List<Subclass> remove(List<Subclass>) dan jatuhkan yang lainnya. Tidak ada alasan untuk mempertahankan metode kedua.   -  person Holger    schedule 21.05.2019


Jawaban (3)


Jika Anda memiliki metode yang memiliki logika yang sama dengan tipe parameter berbeda, Anda dapat membuat versi umum dari metode tersebut. Dalam kasus Anda, metode seperti itu akan terlihat seperti:

    public static <T> List<T> remove(List<T> arrange) {
        List<T> update = new ArrayList<>();

        for (T arranging : arrange) {
            //For-loop body here
        }
        return update;
    }

Kemudian Anda dapat menggunakan metode ini dengan T (Base atau Subclass) apa pun dan metode ini akan bekerja dengan elemen daftar pass sebagai argumen dan mengembalikan tipe yang sesuai juga:

        List<Subclass> one = ...;
        one = remove(one);

        List<Base> two = ...;
        two = remove(two);

Semoga ini membantu.

person Marco R.    schedule 21.05.2019

Yang Anda butuhkan di sini disebut metode generik.

Deklarasi metode generik tunggal yang dapat dipanggil dengan argumen bertipe berbeda. Fungsi umum yang Anda perlukan akan terlihat seperti ini:

public static < E > List<E> remove( List<E> arrange ) {...}

Jika terdapat lebih dari satu tipe generik dan salah satu merupakan subkelas dari tipe generik lainnya (misal BaseClass dan SubClass), deklarasinya akan terlihat seperti

public static < E, F > List<E> remove( List<F extends E> arrange ) {...}

Untuk informasi lebih lanjut, Anda dapat merujuk ke https://www.tutorialspoint.com/java/java_generics.htm

person chakwok    schedule 21.05.2019

Saya melihat Anda berada dalam situasi di mana dua metode melakukan hal yang hampir sama tetapi menyajikan hasilnya secara berbeda kepada pemanggil. Gunakan obat generik jika domain tipe pengembalian lebih besar. public static E remove(List<E> arrange)

Jika tipe pengembalian terbatas, Anda mungkin mengembangkan hubungan antara Basis dan SubKelas. Dan gunakan kovarians untuk menangani beberapa tipe pengembalian.

person Jayant Kumar    schedule 21.05.2019