奇怪的"模板式"语法(泛型?)

Ste*_*ini 4 java generics

在以下行中

Graph<Number,Number> ig = Graphs.<Number,Number>synchronizedDirectedGraph(
                              new DirectedSparseMultigraph<Number,Number>());
Run Code Online (Sandbox Code Playgroud)

你能解释一下是什么Graphs.<Number,Number>synchronizedDirectedGraph意思吗?它看起来像一个方法Graphs.synchronizedDirectedGraph的调用,但点后面的模板式东西困惑我(至少由于我的C++背景).

Mat*_*hen 6

它指定静态方法的类型.有关详细信息,请参阅通用类型,第2部分(特别是"通用方法"部分).


Tho*_*ung 5

问题是Java在它支持类型推断的地方不是很聪明.

对于一种方法:

class A{}
class B extends A{}
class Y{
  static <T> List<T> x(T t)
}
Run Code Online (Sandbox Code Playgroud)

List<B>从参数类型B 推断出类型

List<B> bs = Y.x(new B());
Run Code Online (Sandbox Code Playgroud)

但是如果你需要List<A>你必须转换B或添加编译器提示:

List<A> as1 = Y.<A> x(new B());
List<A> as2 = Y.x((A) new B());
Run Code Online (Sandbox Code Playgroud)

部分问题是java泛型是不变的,因此List<B>不是子类型List<A>.