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 ++?
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 ++?
Jawaban:
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?
float
, itu double
.
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.
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.
calculateAnswer(double, int, double, double)
". Lihat bahwa tipe pengembalian tidak disertakan, @konmik.
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.
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");
}
}
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.
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.
tidak tidak benar-benar mungkin dengan cara itu Anda hanya dapat membebani tanpa argumen atau tipe data dari argumen