Как я могу вызвать универсальный метод с типом, когда он статически импортирован?

Я обнаружил, что вы можете вызвать общий метод со специальным типом, например:

предположим, что у нас есть общий метод:

class ListUtils {
    public static <T> List<T> createList() {
        return new ArrayList<T>();
    }
}

мы можем назвать это так:

List<Integer> intList = ListUtils.<Integer>createList();

Но как мы можем вызвать его, когда он статически импортирован? например.:

List<Integer> intList = <Integer>createList();

это не работает.


person Visus Zhao    schedule 04.11.2010    source источник
comment
Вывод типа не работает для вашего конкретного примера?   -  person Roman    schedule 04.11.2010
comment
возможный дубликат вызова статически импортированного метода с явными параметрами типа   -  person Josh Lee    schedule 29.02.2012
comment
Возможный дубликат вызова статически импортированного метода с явными параметрами типа   -  person bernard paulus    schedule 25.08.2017


Ответы (5)


Вы не можете. Вам нужно будет ссылаться на него, используя имя класса.

Кажется, что имея:

void foo(List<String> a) {}

и вызов foo(createList()) не выводит правильный тип. Поэтому вы должны либо явно использовать имя класса, например ListUtils.createList(), либо использовать промежуточную переменную:

List<String> fooList = createList();
foo(fooList);

Наконец, guava имеет Lists.newArrayList(), так что вам лучше использовать его повторно.

person Bozho    schedule 04.11.2010
comment
Спасибо! Я даже не думал о такой ситуации (звонок на сайте параметра). А я как раз на гуаву наткнулся, она великолепна! - person Visus Zhao; 04.11.2010

Для меня работает следующее:

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();
    }
}
person mindas    schedule 04.11.2010
comment
Спасибо за разъяснение :) Тогда я не совсем понял вывод типов. - person Visus Zhao; 04.11.2010

Вы не можете. Это конструктивный недостаток синтаксиса языка Java. Scala, новый статически типизированный язык для JVM, исправляет это. (Вот как бы вы сделали этот вызов в Scala: val intList: List[Int] = creatList[Int]()).

person Eric Grindt    schedule 04.11.2010

Я полагаю, что Миндас уже продемонстрировал, что это должно работать с выводом, ваш синтаксис немного не так. Однако я бы порекомендовал вам взглянуть на Google Guava, у них есть именно этот метод и несколько других полезных. Нет смысла заново изобретать велосипед :)

person BjornS    schedule 04.11.2010

Насколько я читал, недостатком статического механизма импорта является то, что вы должны указать вызывающий объект/класс, если хотите предоставить формальные параметры. Миндас прав, когда аргументов нет, механизм вывода типов будет использовать тип, которому присваивается возвращаемое значение функции. Однако хитрость заключается в том, что вы приводите аргументы. Если вы хотите избежать указания вызывающего объекта/класса, вы можете ввести hint через приведение аргументов как таковых:

public static <E> E foo(E e) {}

Number n = foo((Number)3);

С подсказкой типа вывод типа вернет объект типа Number, а не Integer, как это могло бы быть в противном случае.

person Jonathan Weatherhead    schedule 03.09.2011