我发现您可以使用特殊类型调用泛型方法,例如:
假设我们有一个通用的方法:
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();
这不起作用。
答案 0 :(得分:9)
你做不到。你必须使用类名来引用它。
似乎有:
void foo(List<String> a) {}
并且调用foo(createList())
并不会推断出正确的类型。因此,您应该明确使用类名称,如ListUtils.createList()
或使用中间变量:
List<String> fooList = createList();
foo(fooList);
最后,guava有Lists.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,否则将返回其他原因。