Overload dengan tipe pengembalian yang berbeda di Java?

104

Mengapa tidak mungkin membebani suatu fungsi hanya dengan mengubah tipe kembalian? Akankah itu berubah di versi Java yang akan datang?

Ngomong-ngomong, hanya untuk referensi, apakah ini mungkin di C ++?

biarawati
sumber
KNU, ​​jawaban lainnya berbeda karena menanyakan pertanyaan secara umum, istilah khusus non-bahasa. Yang juga menarik adalah bahwa jawaban yang diterima dari pertanyaan lain melangkah lebih jauh dengan menentukan bahwa Java JVM memungkinkannya dilakukan dengan manipulasi internal.
J Woodchuck

Jawaban:

157

Anda tidak dapat melakukannya di Java, dan Anda tidak dapat melakukannya di C ++. Alasannya adalah bahwa nilai yang dikembalikan saja tidak cukup bagi compiler untuk mengetahui fungsi mana yang akan dipanggil:

public int foo() {...}
public float foo() {..}

...
foo(); // which one?
Alexander Gessler
sumber
3
Saya selalu berpikir bahwa jika kita melakukan sesuatu seperti int i = foo () atau float f = foo () itu akan tahu yang mana, tetapi jika pernyataan itu hanya fungsi yang kompilator tidak akan tahu. Saya mengerti. Terima kasih.
nunos
7
@nunos bahkan jika float f = foo () kompilator tidak akan bisa mengetahuinya karena int akan menjadi input yang valid untuk float. Bandingkan float f = 7; (Apakah 7 float atau int?)
NomeN
5
@NomeN Tetapi pernyataan Anda menunjukkan bahwa func (int i) dan func (float i) tidak dapat dibedakan untuk kompilator - dan kita semua tahu ini tidak benar. Alasan sebenarnya diberikan oleh Oded (lihat jawaban selanjutnya) - ini tentang tanda tangan metode. Dan, btw. 7 jelas merupakan integer sementara 7.0 atau 7f adalah float ;-)
Ta Sas
7
7.0 bukan float, itu double.
fredoverflow
3
Fakta bahwa foo();tanpa tipe pengembalian akan menjadi ambigu bukanlah alasan untuk melarangnya sebagai kelebihan beban. Ada argumen yang dapat menyebabkan ambiguitas (mis. foo(null);), Tetapi itu tidak membuat kelebihan beban secara inheren tidak valid.
shmosel
48

Alasannya adalah kelebihan beban di Java hanya diperbolehkan untuk metode dengan tanda tangan berbeda .

Jenis kembalian bukan bagian dari tanda tangan metode, oleh karena itu tidak dapat digunakan untuk membedakan kelebihan beban.

Lihat Menentukan Metode dari tutorial Java.

Oded
sumber
4
Tetapi mengapa tipe pengembalian bukan bagian dari tanda tangan
dan
51
oh "hanya karena"! Saya melihat.
andho
3
Jenis pengembalian adalah bagian dari tanda tangan metode. Lihat saja pembongkaran kelas.
konmik
2
Ini benar-benar bukan @konmik - bukan karena aturan metode overloading. Cobalah. Nama metode yang sama, tipe parameter yang sama dalam urutan yang sama, tipe kembalian yang berbeda. Tidak akan dikompilasi.
Oded
3
Ya, karena tipe pengembalian bukan bagian dari tanda tangan . Tanda tangannya adalah - nama metode + jenis dan urutan parameternya. Baca tautan yang saya berikan dalam jawaban saya: "Tanda tangan dari metode yang dinyatakan di atas adalah: calculateAnswer(double, int, double, double)". Lihat bahwa tipe pengembalian tidak disertakan, @konmik.
Oded
22

Sebelum Java 5.0, saat Anda mengganti metode, parameter dan tipe kembalian harus sama persis. Di Java 5.0, ia memperkenalkan fasilitas baru yang disebut tipe pengembalian kovarian. Anda bisa mengganti metode dengan tanda tangan yang sama tetapi mengembalikan subkelas dari objek yang dikembalikan. Dengan kata lain, metode dalam subclass bisa mengembalikan objek yang tipenya adalah subclass dari tipe yang dikembalikan oleh metode dengan tanda tangan yang sama di superclass.

Daneel S. Yaitskov
sumber
3
Saya bingung saat pertama kali melihat ini. Terima kasih telah menjelaskan mengapa ini mungkin!
Dylan Knowles
2
overloading dan overriding berbeda. Overloading tidak (harus) melibatkan warisan
senseiwu
3
Jawaban ini mungkin terdengar menyesatkan untuk pemula di Java, karena sama sekali tidak relevan dengan overloading , ini menimpa - hal lain sama sekali.
azizbekian
4

Overloaded metode di java mungkin memiliki tipe kembalian yang berbeda mengingat argumennya juga berbeda.

Lihat kode contoh.

public class B {

    public String greet() {
        return "Hello";
    }

    //This will work
    public StringBuilder greet(String name) {
        return new StringBuilder("Hello " + name);
    }

    //This will not work
    //Error: Duplicate method greet() in type B
    public StringBuilder greet() {
        return new StringBuilder("Hello Tarzan");
    }

}
Abdullah Khan
sumber
pada dasarnya jenis pengembalian tidak diperhitungkan, hanya argumen, sedih tapi benar
Alexander Mills
1

Kompilator tidak mempertimbangkan tipe kembalian saat membedakan metode, jadi Anda tidak bisa mendeklarasikan dua metode dengan tanda tangan yang sama meskipun metode tersebut memiliki tipe kembalian yang berbeda.

Ganesh
sumber
1

Jenis pengembalian tidak masalah saat membebani metode. Kami hanya perlu memastikan tidak ada ambiguitas!

Satu-satunya cara Java dapat mengetahui metode mana yang harus dipanggil adalah dengan membedakan tipe dari daftar argumen. Jika kompilator mengizinkan dua metode dengan nama yang sama dan tipe argumen yang sama, tidak akan ada cara untuk menentukan mana yang harus dipanggil.

Vinayak
sumber
0

Kompilator tidak mempertimbangkan tipe kembalian saat membedakan metode, jadi Anda tidak bisa mendeklarasikan dua metode dengan tanda tangan yang sama meskipun metode tersebut memiliki tipe kembalian yang berbeda.

Jika Anda mengetahui eksekusi fungsi maka Anda akan sadar bahwa ketika kita memanggil fungsi, bagian definisi dieksekusi dan akhirnya kita memerlukan pernyataan return, maka kita dapat mengatakan return datang setelah definisi keseluruhan fungsi, itulah mengapa jika ada dua atau lebih banyak fungsi dengan nama yang sama dan dengan tipe dan no yang sama. argumen kemudian pada saat memanggil bagaimana compiler akan tahu tentang mana yang akan dipanggil, karena nama fungsi dan parameternya sama. Pada saat memanggil pertama semua fokus akan pada argumen dan nama fungsi dan setelah menyelesaikan definisi fungsi akhirnya kita berurusan dengan pernyataan kembali.

Compile Time Error lebih baik daripada Run Time Error. Jadi, kompilator java membuat kesalahan waktu kompilator jika Anda mendeklarasikan metode yang sama yang memiliki parameter yang sama.

Bhanu
sumber
Apa bedanya dengan jawaban yang diterima? (Juga alasan mengapa ini adalah kesalahan waktu kompilasi adalah karena kompiler tidak dapat mengetahui metode mana yang akan dipanggil, jadi bagaimana cara menghasilkan kode yang dapat dieksekusi dengan benar)
UnholySheep
-2

tidak tidak benar-benar mungkin dengan cara itu Anda hanya dapat membebani tanpa argumen atau tipe data dari argumen

MAYANK AMRIT
sumber