Как я могу вызвать универсальный метод с типом, когда он статически импортирован? - PullRequest
13 голосов
/ 04 ноября 2010

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

предположим, у нас есть универсальный метод:

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

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

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

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

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

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

Ответы [ 5 ]

9 голосов
/ 04 ноября 2010

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

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

void foo(List<String> a) {}

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

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

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

2 голосов
/ 04 ноября 2010

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

2 голосов
/ 04 ноября 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();
    }
}
1 голос
/ 04 ноября 2010

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

0 голосов
/ 03 сентября 2011

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

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

Number n = foo((Number)3);

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

...