Mengapa metode ini referensi tugas mengkompilasi?

I'm berjuang untuk melihat mengapa kode berikut mengkompilasi:

public class MethodRefs {

    public static void main(String[] args) {
        Function<MethodRefs, String> f;

        f = MethodRefs::getValueStatic;

        f = MethodRefs::getValue;
    }

    public static String getValueStatic(MethodRefs smt) {
        return smt.getValue();
    }

    public String getValue() {
        return "4";
    }

}

Saya bisa melihat mengapa tugas pertama adalah sah - getValueStatic jelas pertandingan yang ditentukan Fungsi jenis (itu menerima MethodRefs objek dan kembali String), tapi yang kedua membingungkan saya - getValue metode tidak menerima argumen, jadi mengapa masih valid untuk menetapkan f?

Mengomentari pertanyaan (2)
Larutan

Yang kedua

f = MethodRefs::getValue;

adalah sama seperti

f = (MethodRefs m) -> m.getValue();

Untuk non-statis metode selalu ada implisit argumen yang diwakili sebagai ini di callee.

CATATAN: pelaksanaan sedikit berbeda pada kode byte tingkat tetapi ia melakukan hal yang sama.

Komentar (3)

Non-static method pada dasarnya mengambil ini referensi sebagai jenis khusus dari argumen. Biasanya argumen yang ditulis dalam cara yang khusus (sebelum nama metode, bukan dalam tanda kurung setelah itu), tapi konsep yang sama. The getValue metode mengambil MethodRefs objek (ini) dan mengembalikan sebuah string, sehingga's kompatibel dengan Fungsi<MethodRefs, String> antarmuka.

Komentar (0)

Memungkinkan daging itu keluar sedikit:

import java.util.function.Function;

public class MethodRefs {

  public static void main(String[] args) {
    Function f;

    final MethodRefs ref = new MethodRefs();

    f = MethodRefs::getValueStatic;
    f.apply(ref);
    //is equivalent to 
    MethodRefs.getValueStatic(ref);

    f = MethodRefs::getValue;
    f.apply(ref);
    //is now equivalent to 
    ref.getValue();
  }

  public static String getValueStatic(MethodRefs smt) {
    return smt.getValue();
  }

  public String getValue() {
    return "4";
  }
}
Komentar (0)

Di Jawa Tutorial ini menjelaskan bahwa ada 4 jenis yang berbeda dari metode referensi:

  1. referensi untuk metode statis
  2. referensi untuk contoh metode dari objek tertentu
  3. referensi untuk contoh metode sewenang-wenang objek dari jenis tertentu
  4. referensi untuk sebuah konstruktor

Kasus anda adalah #3, yang berarti bahwa ketika anda memiliki sebuah contoh dari MethodRef yaitu ref, menelepon terapkan pada fungsi f akan setara dengan String s = ref.getValue().

Komentar (0)

Untuk non-statis metode, jenis ini dianggap secara implisit untuk menjadi yang pertama tipe argumen. Sejak itu's dari jenis MethodRefs, jenis check out.

Komentar (0)