Как я могу вызвать универсальный метод с типом, когда он статически импортирован?
Я обнаружил, что вы можете вызвать универсальный метод со специальным типом, например:
Предположим, у нас есть универсальный метод:
class ListUtils {
public static <T> List<T> createList() {
return new ArrayList<T>();
}
}
мы можем назвать это как:
List<Integer> intList = ListUtils.<Integer>createList();
Но как мы можем назвать это, когда он статически импортирован? например:
List<Integer> intList = <Integer>createList();
это не работает.
Ответы
Ответ 1
Вы не можете. Вам нужно будет ссылаться на него с помощью имени класса.
Кажется, что имея:
void foo(List<String> a) {}
и вызов foo(createList())
не выводит правильный тип. Поэтому вы должны либо явно использовать имя класса, например ListUtils.createList()
, либо использовать промежуточную переменную:
List<String> fooList = createList();
foo(fooList);
Наконец, guava имеет Lists.newArrayList()
, поэтому вам лучше использовать его.
Ответ 2
Для меня работает следующее:
package test;
import java.util.List;
import static test.ListUtils.createList;
public class ListConsumer {
public static void main(String[] args) {
List<Integer> list = createList();
List<String> list2 = createList();
}
}
Ответ 3
Вы не можете. Это недостаток дизайна в синтаксисе языка Java. Scala, который является более новым статически типизированным языком в JVM, исправляет это. (Так вы можете сделать этот вызов в Scala: val intList: List[Int] = creatList[Int]()
).
Ответ 4
Я считаю, что Mindas уже продемонстрировал, что это должно работать с умозаключениями, ваш синтаксис просто неактивен. Однако я бы порекомендовал вам взглянуть на Google Guava, у них есть этот точный метод и несколько других полезных. Нет смысла повторно изобретать колесо:)
Ответ 5
Насколько я читал, недостатком механизма статического импорта является то, что вы должны указать вызывающий объект/класс, если вы хотите предоставить формальные параметры.
Mindas правилен, когда нет аргументов, механизм вывода типа будет использовать тип, которому присваивается возвращаемое значение функции. Однако трюк приходит, когда вы предоставляете аргументы. Если вы хотите не указывать вызывающий объект/класс, вы можете вводить подсказку с помощью набора аргументов как такового:
public static <E> E foo(E e) {}
Number n = foo((Number)3);
С подсказкой типа вывод типа возвращает объект типа Number, а не Integer, как это было бы иначе.