小编Sui*_*uic的帖子

使用方法引用时理解与类型推断相关的错误消息

我想从字符串创建非字母字符列表,所以我写道:

str.chars()
        .mapToObj(c -> (char) c)
        .filter(Predicate.not(Character::isAlphabetic))
        .toList();
Run Code Online (Sandbox Code Playgroud)

但是,这会引发以下错误消息:

不存在类型变量的实例,因此字符符合整数推断变量 T 具有不兼容的边界:等式约束:整数下限:字符

我没有完全理解错误消息,但我认为这是由于作为参数而不是 charCharacter#isAlphabetic进行替换而导致的,因为替换为(例如),它可以正常工作。int codePointCharacter::isAlphabeticCharacter::isUpperCasechar

现在,如果我写:

str.chars()
        .mapToObj(c -> (char) c)
        .filter(c -> !Character.isAlphabetic(c))
        .toList();
Run Code Online (Sandbox Code Playgroud)

它编译得很好,我什至没有那么惊讶/困惑。但是,如果我写

str.chars()
        .mapToObj(c -> (char) c)
        .filter(Predicate.not(c -> Character.isAlphabetic(c)))
        .toList();
Run Code Online (Sandbox Code Playgroud)

它也编译得很好,这肯定让我感到困惑,因为它Character::isAlphabetic基本上不等于c -> Character.isAlphabetic(c)?好吧,显然并非在所有情况下(因为据我所知,在大多数情况下)

所以我的两个问题是:

  1. 这个错误消息到底说了什么?我确实在一定程度上理解了,但绝对不完全理解
  2. 为什么第一个版本不起作用但第三个版本可以?

java java-stream

7
推荐指数
1
解决办法
437
查看次数

标签 统计

java ×1

java-stream ×1