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

时间:2010-02-22 05:50:47

标签: java generics

在以下一行

Graph<Number,Number> ig = Graphs.<Number,Number>synchronizedDirectedGraph(
                              new DirectedSparseMultigraph<Number,Number>());
你可以解释Graphs.<Number,Number>synchronizedDirectedGraph的含义吗?它看起来像是对方法Graphs.synchronizedDirectedGraph的调用,但点后面的模板式东西让我困惑(至少由于我的C ++背景)。

2 个答案:

答案 0 :(得分:6)

它指定静态方法的类型。有关详细信息,请参阅Generic Types, Part 2(特别是“通用方法”部分)。

答案 1 :(得分:5)

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

对于方法:

class A{}
class B extends A{}
class Y{
  static <T> List<T> x(T t)
}

它从参数类型B

中推断出类型List<B>
List<B> bs = Y.x(new B());

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

List<A> as1 = Y.<A> x(new B());
List<A> as2 = Y.x((A) new B());

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