2010-11-04 74 views
13

我发现,你可以调用一个特殊类型的通用方法,如:如何在静态导入时使用类型调用泛型方法?

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

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

,我们可以把它想:

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

但我们如何在静态导入时调用它?例如:

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

这不起作用。

+0

不是为你的具体例子输入推理工作吗? – Roman 2010-11-04 10:14:00

+0

[显式类型参数调用静态导入的方法]可能重复(http://stackoverflow.com/questions/2050317/invoking-statically-imported-method-with-explicit-type-parameters) – 2012-02-28 22:52:42

+0

[可能会重复[调用静态导入方法显式类型参数](https://stackoverflow.com/questions/2050317/invoking-statically-imported-method-with-explicit-type-parameters) – 2017-08-25 10:18:29

回答

9

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

似乎有:

void foo(List<String> a) {} 

,并呼吁foo(createList())并不推断正确的类型。所以,你应该明确地使用类的名称,如ListUtils.createList()或使用一个中间变量:

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

最后,guavaLists.newArrayList(),所以你最好使用那个服务。

+0

谢谢!我甚至没有想过这种情况(在参数网站调用)。我只是倚着番石榴,太棒了! – 2010-11-04 15:14:06

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(); 
    } 
} 
+0

感谢您的澄清:)然后,我不太明白类型推断。 – 2010-11-04 15:16:09

1

我相信Mindas已经证明,这应该与推理工作,你的语法只是有点过。不过,我建议你看看谷歌番石榴,他们有这个确切的方法和其他一些有用的可用。没有意义重新发明轮子:)

2

你不能。这是Java语言语法中的一个设计缺陷。 Scala是JVM上的一种新型静态类型语言,可以解决这个问题。 (这是你如何在Scala中进行调用:val intList: List[Int] = creatList[Int]())。

0

据我所知,静态导入机制的一个缺点是,如果你想提供正式的参数,你必须指定调用对象/类。 Mindas是正确的,当没有参数时,类型推断机制将使用函数返回值分配给的类型。然而,当你提供参数时会出现这个技巧。如果你想避免指定调用对象/类,你可以通过对参数的塑像作为这种类型的提示:

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

Number n = foo((Number)3); 

与该类型提示,类型推断将返回Number类型的对象,而不是整数,因为它会另有原因。

相关问题