Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 引用类型中的有界通配符_Java_Generics_Bounded Wildcard - Fatal编程技术网

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