2009-10-27 55 views
1

所以,我正在瀏覽一個java庫(JScience),此處有人在這裏通過向我指出了它來獲取Vectors(數學的,就是這樣)在java中。看起來像這樣的Java方法:public static <F extends Field <F>> DenseVector <F> valueOf(F ... elements)...它們是什麼?

不幸的是,我從來沒有見過在我的生活中的事情像以前一樣:

public static <F extends Field<F>> DenseVector<F> valueOf(F... elements) 

,你可以在DenseVector類調用一個方法。那有什麼意思。難道返回「<F extends Field<F>>」(如果有的話,爲什麼Eclipse的認爲這是一個輸入?)

http://jscience.org/api/org/jscience/mathematics/vector/DenseVector.html#valueOf(F...)

這真的讓我困惑。我不能做一個new DenseVector(),因爲只有超級類有這個,並且它是受保護的,並且試圖做DenseVector.valueOf()顯然只有在我給它時才起作用......那個奇怪的東西作爲輸入。我試過實例化對象(或類似的東西)時,人們不得不實例化方法......是那樣的(或是它是什麼?))什麼是API試圖讓我去做?

我有點糊塗了,我已經在學校學的Java(並用它有點工作,但我們使用了很多的東西,目前存在的除了剛剛JAVA),和整個事情再也沒這樣的。這是爲了什麼?它試圖讓我去做什麼?這是新的嗎?舊?朦朧?

-Jenny

+0

Java泛型非常有用,但是一旦你找到更先進的東西,它也有點難以理解。但是,他們值得學習。幸運的是,調用泛型方法通常相當簡單,當你編寫自己的泛型方法時,真正棘手的部分就會出現。 – Carlos 2009-10-27 20:05:39

+2

泛型已經超過5年了,值得熟悉它們。 – 2009-10-27 20:34:43

回答

4

你應該能夠調用此方法來創建矢量,如下所示:

Real r1 = Real.ONE, r2 = Real.valueOf(2D), r3 = Real.ZERO; 
DenseVector<Real> v = valueOf(r1, r2, r3); 

在這個例子中,類型參數FReal是。 Real服從約束「extends Field<F>」,因爲它實現了Field<Real>

對於不同的應用,可能會使用不同的fields。例如,安全應用程序可能使用ModuloInteger字段。這有點令人困惑,因爲這是一個數學領域,而不是像物理學中談論的「矢量場」。

通過使用類型變量,該庫有助於確保您在給定字段內執行所有操作。例如,如果v與上面一樣被聲明爲DenseVector<Real>,那麼如果您嘗試將其乘以Complex數字,則編譯器會發出抱怨。

3

這是一個通用的返回類型。有關Java泛型的教程,請參閱here

1

這些被稱爲泛型類型。它們已被添加到Java 5中,並且與C++模板類似。

這個想法是,你定義了一個特定類型的項目集合,而不是一般的東西。

這有助於避免頻繁向下轉換。在較老的Java代碼中,假設你知道你的向量只包含X的。一旦您從該集合中檢索到項目,您只需獲取Object,並且必須明確向下轉發它。

它也更安全,因爲你不能把伊蘇成X中的載體,以及更清晰的閱讀出於同樣的原因。

故事屁股的「延伸」,在這些括號的是,你可以定義集合「XS和他們所有的亞型」,將仍然接受X的亞型,但拒絕Y.

1
public static <F extends Field<F>> DenseVector<F> valueOf(F... elements) 

讓我們打破這:

public static 

它是一種公共靜態方法。

<F extends Field<F>> 

及其任何F類的一般方法,其中F是

DenseVector<F> 

它返回與F

valueOf(F... elements) 

的方法的(通用)DenseVector命名的valueOf其中場的一種推廣參數是零個或多個F。

相關問題