В Версии 1 и Версии 2 ваша ссылка на метод String::new
ссылается на конструктор public String(String original)
класса String
.
В Версии 3 и Версии 4 ссылка на метод String::new
ссылается на конструктор public String()
класса String
.
Не имеет значения, возвращает ли метод вашего функционального интерфейса String
или имеет тип возврата void
. В любом случае соответствующая ссылка на метод String::new
соответствует сигнатуре метода вашего интерфейса.
Возможно, написание Java 7 эквивалентов облегчит это понимание:
Версия 1:
HelloWorld h = new HelloWorld () {
String getSomething(String s) {
return new String(s);
}
}
Версия 2:
HelloWorld h = new HelloWorld () {
void getSomething(String s) {
new String(s);
}
}
Версия 3:
HelloWorld h = new HelloWorld () {
String getSomething() {
return new String();
}
}
Версия 4:
HelloWorld h = new HelloWorld () {
void getSomething() {
new String();
}
}