有界谓词的使用
Use of bounded predicates
我想知道为什么这段代码甚至可以编译。因为这里我们有一个 Predicate
,它的类型可以是 String 或其任何超类型 。显然,length()
在对象class中不可用,适合这个谓词。
Predicate<? super String> predicate = s -> s.length() > 3;
Stream.of("cat", "bat", "rat", "doggy").filter(predicate).forEach(System.out::println);
任何人都可以描述我们必须需要这些类型的有界类型谓词的情况吗?
因为 Stream.of(T t...)
returns a Stream<T>
并且你输入了 4 String
s,所以 Stream.of("cat", "bat", "rat", "doggy")
的输出将是 Stream<String>
.
之后,用一个Predicate<? super String>
来过滤一个Stream<String>
就顺理成章了。您是否要创建一个包含字符串和数字的列表,但类型为 List<String>
(例如,通过这段代码...)
List<String> list = new ArrayList<>();
list.add("cat");
list.add("bat");
list.add("rat");
list.add("doggy");
List list2 = list;
list2.add(1);
然后
list.stream().filter(predicate).forEach(System.out::println);
将在运行时遇到整数时抛出 ClassCastException
。
至于您想使用? super Something
的情况,您可以阅读 linked earlier: Difference between <? super T> and <? extends T> in Java
问题的答案
我想知道为什么这段代码甚至可以编译。因为这里我们有一个 Predicate
,它的类型可以是 String 或其任何超类型 。显然,length()
在对象class中不可用,适合这个谓词。
Predicate<? super String> predicate = s -> s.length() > 3;
Stream.of("cat", "bat", "rat", "doggy").filter(predicate).forEach(System.out::println);
任何人都可以描述我们必须需要这些类型的有界类型谓词的情况吗?
因为 Stream.of(T t...)
returns a Stream<T>
并且你输入了 4 String
s,所以 Stream.of("cat", "bat", "rat", "doggy")
的输出将是 Stream<String>
.
之后,用一个Predicate<? super String>
来过滤一个Stream<String>
就顺理成章了。您是否要创建一个包含字符串和数字的列表,但类型为 List<String>
(例如,通过这段代码...)
List<String> list = new ArrayList<>();
list.add("cat");
list.add("bat");
list.add("rat");
list.add("doggy");
List list2 = list;
list2.add(1);
然后
list.stream().filter(predicate).forEach(System.out::println);
将在运行时遇到整数时抛出 ClassCastException
。
至于您想使用? super Something
的情况,您可以阅读