2015-05-08 2 views
5

JLS 15.13 lists examples ссылочных выражений метода. Одним из них являетсяМетод Справочный пример в JLS

(test ? list.replaceAll(String::trim) : list) :: iterator

, который не имеет смысла, так как replaceAllvoid является. Я что-то недопонимаю или это ошибка в JLS (возможно, более ранняя версия replaceAll вернула результирующий список)?

+3

Да, это полностью похоже на ошибку. –

ответ

3

Ну, технически это не указано в JLS, что переменная list имеет тип java.util.List. Так что этот код может быть скомпилирован с некоторым пользовательским типом:

public static class MyList implements Iterable<String> { 
    private final List<String> list = new ArrayList<>(); 

    public MyList add(String val) { 
     list.add(val); 
     return this; 
    } 

    public MyList replaceAll(UnaryOperator<String> op) { 
     list.replaceAll(op); 
     return this; 
    } 

    public Iterator<String> iterator() { 
     return list.iterator(); 
    } 
} 

public Supplier<Iterator<String>> it(MyList list, boolean test) { 
    return (test ? list.replaceAll(String::trim) : list) :: iterator; 
} 

Но в целом это выглядит как они предназначены, чтобы сделать пример, основанный на java.util.List. Таким образом, вероятно, было бы лучше заменить его чем-то JDK-based.

Смежные вопросы