Pertanyaan Bisakah dua metode Java memiliki nama yang sama dengan jenis pengembalian yang berbeda? [duplikat]


Pertanyaan ini sudah memiliki jawaban di sini:

Bisakah dua metode Java memiliki nama yang sama dengan berbeda jenis kembali? Jenis kembalinya metode berbeda dan mereka dideklarasikan dengan nama metode yang sama.

Apakah itu diperbolehkan?


76
2018-04-06 04:25


asal


Jawaban:


Jika kedua metode memiliki tipe parameter yang sama, tetapi jenis pengembalian yang berbeda dari itu tidak mungkin. Dari Spesifikasi Bahasa Jawa, Java SE 8 Edition, §8.4.2. Metode Signature:

Dua metode atau konstruktor, M dan N, memiliki tanda tangan yang sama jika mereka memiliki nama yang sama, parameter tipe yang sama (jika ada) (§8.4.4), dan, setelah mengadaptasi jenis parameter formal N ke parameter tipe M, tipe parameter formal yang sama.

Jika kedua metode memiliki tipe parameter yang berbeda (jadi, mereka memiliki tanda tangan yang berbeda), maka itu mungkin. Ini disebut overloading.


74
2018-04-06 04:29



Hanya saja, jika mereka menerima parameter yang berbeda. Jika tidak ada parameter, maka Anda harus memiliki nama yang berbeda.

int doSomething(String s);
String doSomething(int); // this is fine


int doSomething(String s);
String doSomething(String s); // this is not

28
2018-04-06 04:28



Menurut JLS, Anda tidak dapat namun karena fitur / bug di compiler Java 6/7 (Oracle JDK, OpenJDK, IBM JDK) Anda dapat memiliki jenis pengembalian yang berbeda untuk metode yang sama jika Anda menggunakan generik.

public class Main {
    public static void main(String... args) {
        Main.<Integer>print();
        Main.<Short>print();
        Main.<Byte>print();
        Main.<Void>print();
    }

    public static <T extends Integer> int print() {
        System.out.println("here - Integer");
        return 0;
    }
    public static <T extends Short> short print() {
        System.out.println("here - Short");
        return 0;
    }
    public static <T extends Byte> byte print() {
        System.out.println("here - Byte");
        return 0;
    }
    public static <T extends Void> void print() {
        System.out.println("here - Void");
    }
}

Cetakan

here - Integer
here - Short
here - Byte
here - Void

Untuk lebih jelasnya, baca artikel saya di sini


18
2018-04-06 06:28



Tidak. C ++ dan Java sama-sama melarang overloading pada tipe kembalian fungsi. Alasannya adalah bahwa overloading pada return-type dapat membingungkan (mungkin sulit bagi pengembang untuk memprediksi overload mana yang akan dipanggil). Bahkan, ada orang-orang yang berpendapat bahwa setiap overloading dapat membingungkan dalam hal ini dan merekomendasikan menentangnya, tetapi bahkan mereka yang mendukung overloading tampaknya setuju bahwa bentuk khusus ini terlalu membingungkan.


6
2018-04-06 04:28



Anda dapat memiliki dua metode dengan argumen yang sama dan jenis pengembalian yang berbeda hanya jika salah satu metode diwariskan dan jenis pengembaliannya kompatibel.

Sebagai contoh:

public class A
{
    Object foo() { return null; }
}

public class B
    extends A
{
    String foo() { return null; }
}

4
2018-04-06 05:13



Hanya jika deklarasi parameter mereka berbeda dari memori.


2
2018-04-06 04:27



Dokumentasi java menyatakan:

Compiler tidak mempertimbangkan jenis pengembalian ketika membedakan metode, sehingga Anda tidak dapat mendeklarasikan dua metode dengan tanda tangan yang sama bahkan jika mereka memiliki jenis pengembalian yang berbeda.

Lihat: http://docs.oracle.com/javase/tutorial/java/javaOO/methods.html


2
2017-07-17 09:01



Jika berada di kelas yang sama dengan jumlah parameter yang sama dengan jenis dan urutan yang sama, Maka tidak mungkin misalnya:

int methoda(String a,int b) {
        return b;
}
String methoda(String b,int c) {
        return b;    
}

jika jumlah parameter dan jenisnya sama tetapi pesanan berbeda maka mungkin karena menghasilkan metode overloading. Ini berarti jika tanda tangan metode sama yang mencakup nama metode dengan jumlah parameter dan jenisnya serta urutannya ditentukan.


1
2017-11-13 18:16



Bahkan jika itu adalah thread lama, mungkin ada yang tertarik.

Jika itu adalah pilihan bagi Anda untuk menggunakan samametode di dalam kelas yang sama dan mengarsipkan jenis pengembalian yang berbeda, gunakan generik: Oracle Lesson Generics

Contoh sederhana untuk kelas pemegang nilai generik:

class GenericValue<T> {
  private T myValue;

  public GenericValue(T myValue) { this.myValue = myValue; }

  public T getVal() { return myValue; }
}

Dan gunakan seperti ini:

public class ExampleGenericValue {
  public static void main(String[] args) {
    GenericValue<Integer> intVal = new GenericValue<Integer>(10);
    GenericValue<String> strVal = new GenericValue<String>("go on ...");

    System.out.format("I: %d\nS: %s\n", intVal.getVal(), strVal.getVal());
  }
}

... akan menghasilkan output berikut:

I: 10
S: go on ...

1
2017-07-08 12:06