假设我们有一个谓词声明为Predicate<? super SomeClass>
。我天真地期望它适用于任何超类SomeClass
向上的层次结构,包括Object
.
然而这个谓词不适用于Object
。我收到以下错误:
Predicate 类型中的方法 test(capture#3-of ? super SomeClass) 不适用于参数 (Object)
Demo https://ideone.com/pTxzvl.
Why is Predicate<? super SomeClass>
不适用于以下实例Object
?
代码:
import java.util.*;
import java.lang.*;
import java.io.*;
import java.net.URL;
import java.util.function.Predicate;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
Predicate<? super URL> p = u -> u.getFile().isEmpty();
p.test(new Object());
}
}
For a Predicate<? super SomeClass>
变量,您可以分配一个Predicate<SomeClass>
实例,或Predicate<Object>
实例。
但是,您不能通过Object
to the test()
的方法Predicate<SomeClass>
。你只能通过一个SomeClass
实例。
因此你不能通过Object
to the test()
的方法Predicate<? super SomeClass>
考虑以下:
Predicate<URL> p1 = u -> u.getFile().isEmpty();
Predicate<? super URL> p2 = p1;
p2
指的是Predicate<URL>
,所以你不能通过new Object()
to its test()
method.
换句话说,为了p.test(new Object())
要被编译器接受,它必须有效any Predicate
可以分配给Predicate<? super URL> p
多变的。自从Predicate<URL>
Predicate
可以分配给该变量,并且它的test()
method cannot接受一个Object
, p.test(new Object())
不能被编译器接受。
顺便说一句,在您的具体示例中,您正在创建一个Predicate<URL>
, and URL
是最后一堂课。因此,您应该简单地将其声明为:
Predicate<URL> p = u -> u.getFile().isEmpty();
没有理由? super
or ? extends
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)