gpt4 book ai didi

java - 为什么谓词 不适用于对象?

转载 作者:搜寻专家 更新时间:2023-10-30 21:45:09 25 4
gpt4 key购买 nike

假设我们有一个声明为 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>实例。

但是,您不能传递 Objecttest() Predicate<SomeClass> 的方法.你只能传递一个 SomeClass实例。

因此你不能传递 Objecttest() 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com