<U> 这句话中的第一个是什么意思?


public static <U> Predicate<U> isEqualsTo(U u) {
    return s -> s.equals(u);
    /*Predicate<U>  return type
    U u is the parameter
    s-> s.equals(u) is the lambda expression */
}

Predicate<U>之前的第一个<U>是什么意思?

它是方法的泛型类型。例如,不太复杂的东西:

public static <U> void doSomething(U u) {
    System.out.println(u);
}

你可以在 Java 中参数化任何你想要的函数,就像你对类所做的那样。它不仅适用于静态方法,也适用于实例方法。你可以像这样调用该函数:

<String>doSomething("hello");
<Integer>doSomething(42);

最棒的是,当使用泛型方法时,类型推断在 Java 中运行得非常好,因此您可以像这样调用上述函数:

doSomething("hello,world");
doSomething(42);

而不告诉编译器您正在使用什么类型。

在此处查看文档。

第一个<U>声明方法的泛型类型U。它是一个占位符,用于替换静态类型定义。

使用此泛型函数,您现在可以使用任何类型的输入,因为输入参数的类型uU ,我们的泛型类型占位符。

这个泛型

函数的输出被定义为另一个泛型对象,Predicate<>的实例,但参数化为我们用作输入类型的相同泛型类型U

//           | generic type(s) of this method
//           |
//           |   | type of return value  | type of parameter   
//           _______________           _
public static <U> Predicate<U> isEqualsTo(U u) {
    return s -> s.equals(u);
}

假设你有

public abstract class Predicate<T> 
{
    public static <U> Predicate<U> isEqualsTo(U u) {
        return null;
    }
    public static void isNotEqualsTo(Object u) {
    }
}

然后返回类型必须与您传递的类型相同。

public class Temp 
{
    public static void main(String args[])
    {
        Predicate<String> str=Predicate.isEqualsTo(new String("ewrqe"));
        Predicate<Integer> integer=Predicate.isEqualsTo(new Integer(200));
        Predicate.isNotEqualsTo(new String("ewrqe"));
        Predicate.isNotEqualsTo(new Integer(200));
    }
}

它指示该方法是泛型的,因此可以在调用时返回指定的任何指定类型。

见 https://docs.oracle.com/javase/tutorial/java/generics/methods.html

相关内容

最新更新