为Java 8方法引用提供类型参数

时间:2014-07-03 21:40:36

标签: java java-8

我有一个带有静态方法的类,如下所示:

public class Foo {
  public static <T> T foo() {
    // do something
  }
}

如果我想致电Foo.foo并确保返回类型为T,我可以说Foo.<T>foo()。如何为方法参考Foo::foo执行相同的操作?我尝试过Foo::<T>foo,但这似乎不是有效的语法。

1 个答案:

答案 0 :(得分:2)

表单Type::<Arg>name是一个有效的语法,但你必须在参数中加入一个具体的类型。方法foo()之外没有类型T,因此除非您在范围内有另一个Foo::<T>foo,否则特定表达式T将无效。

但是,请注意,在大多数情况下,根本不需要指定类型参数。它将从上下文推断:

public class Foo {
  public static <T> T foo() {
    // do something
    return null;
  }
  // you can specify type arguments
  static Supplier<String> S0=Foo::<String>foo;
  static Supplier<Integer> I0=Foo::<Integer>foo;
  // but there is no need for it:
  static Supplier<String> S1=Foo::foo;
  static Supplier<Integer> I=Foo::foo;
}

但请注意,像public static <T> T foo()这样的方法没有任何意义。由于方法实现不可能检测调用者对T期望的类型,因此它可以返回的唯一值是null。好吧,如果它只是一个占位符,它可能是有意义的。