13

我发现您可以调用具有特殊类型的泛型方法,例如:

假设我们有一个通用方法:

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

我们可以这样称呼它:

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

但是静态导入的时候怎么调用呢?例如:

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

这不起作用。

4

5 回答 5

9

你不能。您必须使用类名来引用它。

似乎有:

void foo(List<String> a) {}

并且调用foo(createList())不会推断出正确的类型。因此,您应该明确使用类名,例如ListUtils.createList()或使用中间变量:

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

最后,番石榴Lists.newArrayList(),所以你最好重用它。

于 2010-11-04T10:21:49.423 回答
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();
    }
}
于 2010-11-04T10:22:50.817 回答
2

你不能。这是 Java 语言语法中的设计缺陷。Scala 是 JVM 上一种较新的静态类型语言,它解决了这个问题。(这就是你在 Scala 中的调用方式:)val intList: List[Int] = creatList[Int]()

于 2010-11-04T13:33:43.887 回答
1

我相信 Mindas 已经证明这应该适用于推理,你的语法有点偏离。但是我建议你看看 Google Guava,他们有这个确切的方法和其他一些有用的方法。没有意义重新发明轮子:)

于 2010-11-04T11:48:10.427 回答
0

据我所知,静态导入机制的一个缺点是,如果您希望提供形式参数,则必须指定调用对象/类。Mindas 是正确的,当没有参数时,类型推断机制将使用函数返回值被分配给的类型。然而,当你提供论点时,诀窍就来了。如果您希望避免指定调用对象/类,您可以通过参数的转换来输入提示,如下所示:

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

Number n = foo((Number)3);

使用类型提示,类型推断将返回一个 Number 类型的对象,而不是 Integer,否则它会推断。

于 2011-09-03T19:23:26.897 回答