当静态导入时,如何使用类型调用Generic方法?

时间:2010-11-04 10:11:24

标签: java generics static-import

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

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

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 个答案:

答案 0 :(得分:9)

你做不到。你必须使用类名来引用它。

似乎有:

void foo(List<String> a) {}

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

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

最后,guavaLists.newArrayList(),因此您最好重复使用它。

答案 1 :(得分: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();
    }
}

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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

Number n = foo((Number)3);

使用类型提示,类型推断将返回Number类型的对象,而不是Integer,否则将返回其他原因。