java - 为什么谓词 <? super SomeClass> 不适用于对象?

标签 java generics java-8 predicate

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

相关文章:

Java 8 日期时间解析,可选 2-4 年组件

java - 在 Mac OS X 上通过 java 程序使用命令写入文件

Java JComponent 在 JFrame 边缘附近被切断

java - 如何检查方法的哪一部分使用时间最多?

java - C++ 和 Java 中的 "generic"类型有什么区别?

c# - 如何在 C# 中获取泛型类的子类型

java - Java 类中的 Scala getter 和 setter

java - 如何访问存储在链表集合中的对象的实例变量?

java - Netbeans 中的 Lambda 表达式问题

java - Collectors.groupingBy 用于 Map<Long, List<String>> 并进行一些字符串操作