【问题标题】:What does the first <U> in this statement mean?该语句中的第一个 <U> 是什么意思?
【发布时间】:2016-04-13 06:48:06
【问题描述】:
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&lt;U&gt; 之前的第一个 &lt;U&gt; 是什么意思?

【问题讨论】:

  • 您必须先声明一个类型参数,然后才能使用它。第一个&lt;U&gt; 声明它,Predicate&lt;U&gt; 中的第二个和参数类型U 使用它。这与像class MyClass&lt;T&gt; 这样的类型声明不同,它同时声明和使用T。除此之外,在这种特定情况下,使用U 作为参数类型是没有意义的。它也可以与 Object 一起使用,就像在 Java 8 的 Predicate.isEqual(Object) 中所做的那样……

标签: java generics predicate


【解决方案1】:

它是方法的泛型。例如,不太复杂的事情:

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

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

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

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

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

不告诉编译器你使用的是什么类型。

查看文档here.

【讨论】:

  • 方法的泛型类型是什么意思?泛型返回类型,泛型参数理解了,但是方法的泛型类型是什么意思呢?感谢您的回复
  • 这意味着您可以根据需要指定通用返回类型或参数。您可以使用您希望的任何类型参数调用我上面的方法,并且函数的参数将根据类型参数而改变。您还可以为多种类型的参数设置多个类型参数。 :)
【解决方案2】:

第一个&lt;U&gt; 声明了您的方法的泛型类型U。它是替换静态类型定义的占位符。

有了这个泛型函数,您现在可以使用任何类型的输入,因为您的输入参数u 的类型是U,我们的泛型类型占位符。

这个泛型函数的输出被定义为另一个泛型对象,Predicate&lt;&gt; 的一个实例,但使用与我们用作输入类型相同的泛型类型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);
}

【讨论】:

    【解决方案3】:

    让我们说你有

    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));
        }
    }
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-05
        • 2021-12-25
        • 2014-03-30
        • 1970-01-01
        • 1970-01-01
        • 2011-04-28
        • 2012-01-02
        相关资源
        最近更新 更多