Предоставление параметра типа для ссылки на метод Java 8

1

У меня есть класс со статическим методом, например:

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

Если бы я хотел вызвать Foo.foo и убедиться, что тип возврата был T, я мог бы сказать Foo.<T>foo(). Как я могу сделать то же самое для ссылки на метод Foo::foo? Я пробовал Foo::<T>foo но это не похоже на синтаксис.

  • 0
    Что заставляет вас думать, что это не верно?
  • 0
    @ Sotirios intellij 13. Я знаю, что это означает, что это не обязательно недействительная Java 8, потому что я видел много мест, где intellij сообщает что-то, используя «новые» функции как недействительные, но код компилируется с javac. однако, к сожалению, так как код почти всегда будет редактироваться с помощью intellij, я ограничен тем, что он примет.
Показать ещё 4 комментария
Теги:
java-8

1 ответ

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. Хорошо, это может иметь смысл, если оно действует только как заполнитель.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню