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
?
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.
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.
Memungkinkan daging itu keluar sedikit:
import java.util.function.Function;
public class MethodRefs {
public static void main(String[] args) {
Function<MethodRefs, String> 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";
}
}
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
yaitu ref
, menelepon terapkan
pada fungsi f
akan setara dengan String s = ref.getValue()
.
Untuk non-statis metode, jenis ini
dianggap secara implisit untuk menjadi yang pertama tipe argumen. Sejak itu's dari jenis MethodRefs
, jenis check out.