С учетом следующего кода:
package com.gmail.oksandum.test;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
}
public void foo() {
class LocalFoo {
LocalFoo(String in) {
//Some logic
}
}
List<String> ls = new ArrayList<>();
ls.stream().map(LocalFoo::new); //Line 21
}
}
моя IDE не дает мне никаких ошибок. То есть, пока я не попытаюсь построить проект и запустить его. Когда я это делаю, это дает мне ошибку компилятора, которая выглядит так:
Error:(21, 24) java: incompatible types: cannot infer type-variable(s) R
(argument mismatch; invalid constructor reference
cannot access constructor LocalFoo(java.lang.String)
an enclosing instance of type com.gmail.oksandum.test.Test is not in scope)
Теперь, я понял, учитывая сообщение об ошибке, что это не произойдет, если foo() были статическими. И совершенно верно, это происходит только в том случае, если foo() является методом экземпляра. И это происходит только в том случае, если LocalFoo является локальным классом в методе экземпляра и только если используется ссылка на конструктор (т.е. Никогда не является регулярной ссылкой на метод).
Что еще, если я сменю строку 21 на
ls.stream().map(str -> new LocalFoo(str));
компилятор не дает ошибок.
Итак, чтобы повторить. Если я попытаюсь использовать ссылку на конструктор в локальном классе, объявленном в методе экземпляра, компилятор жалуется на невозможность доступа к конструктору, о котором я запутался.
Если кто-то может пролить свет на то, почему это происходит, это будет оценено. Спасибо.