不兼容的类型:谓词<CAP#1>无法转换为谓词<?超级CAP#2>

Asi*_*taq 5 predicate java-8 java-stream

这是我的代码.

import java.util.stream.Stream;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.function.Predicate;

public class StreamMethod{
    public static void main(String... args){
        List<Integer> data = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5,6,7,8));

        allMatch(data, x -> x < 10);
    }

    public static <T> void allMatch(List<?> list, Predicate<? super T> predicate){
        boolean allSatisfy = list.stream().allMatch(predicate);
        System.out.println(allSatisfy);
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到了错误incompatible types: Predicate<CAP#1> cannot be converted to Predicate<? super CAP#2>.你能帮我解决一下吗?为什么会显示此错误?

然后我也将上面的传递参数更改为

Predicate<Integer> pred= x -> x < 10;
allMatch(data, pred);
Run Code Online (Sandbox Code Playgroud)

但仍面临错误.

Eug*_*ene 2

你应该List<T> list改为List<?> list

  • @UnKnown 使用通配符“?”作为值列表的问题是编译器不知道“allMatch”方法中的元素属于哪种类型。虽然“Predicate”用于“T”,但该列表可以包含任何内容:“T”、“Object”、“Banana”、“Minion”...并且错误告诉您“Predicate” ` 不能用于过滤这些值。通过使用“List&lt;T&gt;”,您可以向编译器显示所有元素都将是“T”,并且“Predicate”可以过滤这些元素。 (2认同)