У меня есть класс со статическим методом, например:
public class Foo {
public static <T> T foo() {
// do something
}
}
Если бы я хотел вызвать Foo.foo
и убедиться, что тип возврата был T
, я мог бы сказать Foo.<T>foo()
. Как я могу сделать то же самое для ссылки на метод Foo::foo
? Я пробовал Foo::<T>foo
но это не похоже на синтаксис.
Форма 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
. Хорошо, это может иметь смысл, если оно действует только как заполнитель.