2010-02-22 76 views
4

在下面一行奇怪「模板式」的語法(仿製藥?)

Graph<Number,Number> ig = Graphs.<Number,Number>synchronizedDirectedGraph(
           new DirectedSparseMultigraph<Number,Number>()); 

請你解釋一下Graphs.<Number,Number>synchronizedDirectedGraph手段?它看起來像一個Graphs.synchronizedDirectedGraph方法的調用,但點後面的模板類thingie困惑我(至少由於我的C++背景)。

+0

圖<數字,數字> ig - >變量ig de型圖avec les .......paramètresgeneric ..... ..圖形。 - > Appel d'uneméthodestatique de圖表 ...... - >paramètresgeneric de laméthode..... synchronizedDirectedGraph - > nom de laméthode...... new DirectedSparseMultigraph () - > Nouvelle實例........ deDirectedSparceMultigraph avec commeparamètresgeneric <數字,數字> – jjj 2010-02-22 05:58:16

+0

答案來源:http://www.developpez.net/forums/d704051/java/ general-java/probleme-ligne-code/ – jjj 2010-02-22 05:59:54

+0

在C++中,您可以將模板參數放在函數名稱後面。 Java區分泛型類型和泛型方法的語法(對於類型/字段和方法,它也使用不同的名稱空間)。請注意,出於語法原因,您確實需要前面的類型(除非當您可能錯失批次時可以隱含泛型參數)。 – 2010-02-22 06:04:39

回答

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>的子類型。

6

它指定了靜態方法的類型。有關更多信息,請參閱Generic Types, Part 2(特別是「Generic mehods」部分)。