2016-12-06 1 views
1

Я ввел Checker Framework v2.1.6 для проекта java8 и исправлены все ошибки nullness, но я застрял на следующую ошибкеJava собирать метод несовместимого с каркасом Checker

Main.java:52: error: [assignment.type.incompatible] incompatible types in assignment. 

List<String> collectedStrings = strings.stream().collect(Collectors.toList()); 
                    ^
    found : @Initialized @NonNull List<@Initialized @Nullable Object> 
    required: @UnknownInitialization @Nullable List<@Initialized @NonNull String> 

Следующая (упрощенный) пример коды бросает ошибку

List<String> strings = new ArrayList<>(); 
strings.add("test"); 
List<String> collectedStrings = strings.stream().collect(Collectors.toList()); 
collectedStrings.forEach(System.out::println); 

Теперь я могу обойти эту проблему, сделав результат @Nullable

List<@Nullable String> collectedStrings = strings.stream().collect(Collectors.toList()); 

Но это только каскадирует ошибку на следующий звонок, который теперь считает, что собранныеStrings подозрительно

У кого-нибудь есть хорошая работа для этого?

+0

Я думаю, вам нужно предоставить явный тип параметра вызову Collectors.toList(). Кажется, что вывод типа снова терпит неудачу. Я не уверен, однако, поскольку я не знаком с Checker. – glee8e

ответ

4

Проблема заключается в том, что Checker Framework предполагает, что Collectors.toList() возвращает List<@Nullable...>. Это безопасное, консервативное предположение, но в вашем контексте вы хотите List<@NonNull...>. Вывод типа Checker Framework в настоящее время слишком слаб, чтобы вывести нужный тип.

Самый чистый способ решить эту проблему - изменить Collectors.toList() на Collectors.<String>toList(). (Написание только String эквивалентно @NonNull String.)

Альтернативой является подавление предупреждения, написание @SuppressWarnings("nullness") по заданию.

В приведенном ниже коде показаны все эти возможности.

import java.util.ArrayList; 
import java.util.List; 
import java.util.stream.Collectors; 
import java.util.stream.Stream; 
import org.checkerframework.checker.nullness.qual.Nullable; 

public class CollectorsToList { 

    void m(List<String> strings) { 
    Stream<String> s = strings.stream(); 

    // This works: 
    List<String> collectedStrings1 = s.collect(Collectors.<String>toList()); 
    // This works: 
    List<@Nullable String> collectedStrings2 = s.collect(Collectors.toList()); 
    // This works: 
    @SuppressWarnings("nullness") 
    List<String> collectedStrings3 = s.collect(Collectors.toList()); 

    // This assignment issues a warning due to incompatible types: 
    List<String> collectedStrings = s.collect(Collectors.toList()); 

    collectedStrings.forEach(System.out::println); 
    } 
}