Lebih
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
?
44
5
Yang kedua
adalah sama seperti
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.
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. ThegetValue
metode mengambilMethodRefs
objek (ini
) dan mengembalikan sebuah string, sehingga's kompatibel denganFungsi<MethodRefs, String>
antarmuka.Memungkinkan daging itu keluar sedikit:
Di Jawa Tutorial ini menjelaskan bahwa ada 4 jenis yang berbeda dari metode referensi:
Kasus anda adalah #3, yang berarti bahwa ketika anda memiliki sebuah contoh dari
MethodRef
yaituref
, meneleponterapkan
pada fungsif
akan setara denganString s = ref.getValue()
.Untuk non-statis metode, jenis
ini
dianggap secara implisit untuk menjadi yang pertama tipe argumen. Sejak itu's dari jenisMethodRefs
, jenis check out.