假设我们有一个声明为 Predicate<? super SomeClass>
的谓词.我会天真地期望它适用于 SomeClass
的任何父类(super class)在层次结构中向上,包括 Object
.
但是这个谓词不适用于Object
.我收到以下错误:
The method test(capture#3-of ? super SomeClass) in the type Predicate is not applicable for the arguments (Object)
Demo .
为什么是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());
}
}
最佳答案
对于 Predicate<? super SomeClass>
变量,你可以分配一个Predicate<SomeClass>
实例,或 Predicate<Object>
实例。
但是,您不能传递 Object
到 test()
Predicate<SomeClass>
的方法.你只能传递一个 SomeClass
实例。
因此你不能传递 Object
到 test()
Predicate<? super SomeClass>
的方法
考虑以下几点:
Predicate<URL> p1 = u -> u.getFile().isEmpty();
Predicate<? super URL> p2 = p1;
p2
指的是 Predicate<URL>
, 所以你不能传递 new Object()
到它的test()
方法。
换句话说,为了p.test(new Object())
要被编译器接受,它必须对 any 有效 Predicate
可以分配给 Predicate<? super URL> p
多变的。自 Predicate<URL>
Predicate
可以分配给那个变量,它的test()
方法不能接受Object
, p.test(new Object())
不能被编译器接受。
顺便说一句,在您的具体示例中,您正在创建一个 Predicate<URL>
, 和 URL
是最后一个类。因此,您应该简单地将其声明为:
Predicate<URL> p = u -> u.getFile().isEmpty();
没有理由 ? super
或 ? extends
.
关于java - 为什么谓词 <? super SomeClass> 不适用于对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50248764/