2014-10-23 4 views
3
public interface Filter<M> { 

    boolean match(M m); 

    public static <T> Collection<T> filter(Collection<T> collection, Filter<T> filter) { 
     return collection.stream().filter(filter::match).collect(Collectors.toList()); 
    } 

    //////////////////////////////////////////////////////////////// 

    public static void main(String[] args) { 
     ArrayList<Integer> intList = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8)); 
     System.out.println(intList); 

     List<Integer> list = filter(intList, null); 

     System.out.println(list); 
    } 
} 

parameter type errorПочему это неправильно? о Java 8 потокового

Я учусь о Java 8 функции потоковой передачи, и это мой проблематичный код ...

Я не знаю, почему аргумент intList не соответствует filter() метода , Java должна знать <T> is Integer здесь, правильно?

+6

Пожалуйста, разместите свой код * как код *, а не как снимок экрана. То, как вы это сделали, намного усложняет задачу для нас воспроизвести проблему. –

+0

@JonSkeet Edited. – JSPDeveloper01

+0

В качестве примечания: если вы не изменяете 'intList', как в вашем примере кода, нет необходимости обертывать результат' Arrays.asList' в 'ArrayList', он * is * уже является' List '. С другой стороны, если у вас есть изменяемый список, такой как 'ArrayList', и вам больше не требуется исходное содержимое' intList', на '' сборке ''' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'позволяет на месте фильтровать. В любом случае вы можете упростить свой код ... – Holger

ответ

7

Я еще не уверен, почему вы получаете эту конкретную ошибку, но проблема в том, что ваш метод заявляет, что он вернет Collection<T>, но вы пытаетесь присвоить результат List<T>. Если вы измените объявление filter на:

public static <T> List<T> filter(Collection<T> collection, Filter<T> filter) 

... то он компилируется без каких-либо проблем.

+0

Да, я изменил 'list' на' Collection ', и ошибка также исчезла. Это скорее похоже на ошибку типа возвращаемого значения, а не на ошибку типа аргумента. Благодарю. – JSPDeveloper01

+0

он также может отличать результат следующим образом: 'Список list = (Список ) filter (intList, null);' С этим решением он сохранил возвращаемый тип коллекции для многих других объектов. –

+2

@ManuZi: Но это * слабее * решение - метод определенно возвращает список, потому что он использует 'Collectors.toList()', поэтому имеет смысл указать, что он возвращает список ... –

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