Java 引用类型中的有界通配符
我很难理解下面关于两个Java 引用类型中的有界通配符,java,generics,bounded-wildcard,Java,Generics,Bounded Wildcard,我很难理解下面关于两个谓词对象的代码。第一个使用下界通配符,第二个使用上界通配符 Predicate当您有Predicate时,您可以为p1调用startsWith,即使p1是用下限键入的,也是合法的?超级字符串,因为类型参数被推断为字符串。lambda表达式s->s.startsWith(“a”)被推断为一个谓词,这是合法的,可以分配给类型为谓词的变量。对于您的答案,为什么p1正在工作现在完全有意义了。但我仍然在与p2进行斗争。对象的实际类型是什么,为什么不能是谓词,而只能是谓词?使用p2,您
谓词对象的代码。第一个使用下界通配符,第二个使用上界通配符
Predicate当您有Predicate时,您可以为p1
调用startsWith
,即使p1
是用下限键入的,也是合法的?超级字符串
,因为类型参数被推断为字符串
。lambda表达式s->s.startsWith(“a”)
被推断为一个谓词
,这是合法的,可以分配给类型为谓词的变量。对于您的答案,为什么p1
正在工作现在完全有意义了。但我仍然在与p2进行斗争。对象的实际类型是什么,为什么不能是谓词
,而只能是谓词
?使用p2
,您将类型声明为谓词UNTRO-您可能缺少的一点是编译器根据变量的类型决定您可以对变量执行什么操作,不在它恰好指向的对象的类上。换句话说,当你们声明PredicateThanks的时候,我现在明白了。这些解释以及列表
示例都有所帮助。谢谢您对谓词的解释
void addFilter(Predicate<? super String> filter) { ... }
addFilter((CharSequence cs) -> cs.length() % 2 == 0);
Predicate<? extends CharSequence> predicate = (String s) -> s.startsWith("...");
predicate.test(new StringBuilder());
Predicate<String> ps = s -> s.startsWith("a");
Predicate<? super String> p1 = ps;
// no "startsWith" on Object
Predicate<? super String> p1 = (Object s) -> s.startsWith("a");
p1.test(new Object()); // Error: can't pass something higher than String