次のようなJavaメソッド:public static< F extends Field< F>> DenseVector< F> valueOf(F… elements)…それらは何ですか?
質問
だから、JavaでVector(つまり数学的なもの)を取得するためにここに誰かが私にそれを指摘した後、私はJavaライブラリ(JScience)を調べています。
残念ながら、次のように人生で何も見たことがありません:
public static <F extends Field<F>> DenseVector<F> valueOf(F... elements)
DenseVectorクラスで呼び出すことができるメソッドとして。それは一体何の意味ですか。 &quot; &lt; F extends Field&lt; F&gt;&gt;
&quot; (もしそうなら、なぜEclipseはそれが入力だと思うのですか?)
本当に混乱しています。 新しいDenseVector()
を作成することはできません。スーパークラスのみがそれを持ち、保護されているためです。 DenseVector.valueOf()
を実行しようとすると、明らかにそれを...それ...入力として奇妙なもの。
オブジェクト(またはそのようなもの)をインスタンス化するときにメソッドをインスタンス化する必要がある人々を見てきました...それはそのようなものですか(またはそれですか?))APIが私に何をさせようとしているのですか?
私は学校でJavaを学んだ(そして、Javaだけでなく多くのDiffernetを使用しているが、仕事で少し使用した)ので、このようなことは一度もなかったので、ちょっと混乱しています。何のために?私に何をさせようとしているのですか?新しいですか?古い?あいまいですか?
-ジェニー
解決
次のように、このメソッドを呼び出してベクターを作成できるはずです:
Real r1 = Real.ONE, r2 = Real.valueOf(2D), r3 = Real.ZERO;
DenseVector<Real> v = valueOf(r1, r2, r3);
この例では、型引数 F
は Real
です。 Real
は制約に従います&quot; extends Field&lt; F&gt;
&quot; Field&lt; Real&gt;
を実装しているためです。
異なるアプリケーションでは、異なるフィールドが使用される可能性があります。たとえば、セキュリティアプリケーションは ModuloInteger
フィールドを使用する場合があります。これは数学的なフィールドであり、「ベクトルフィールド」ではないため、少し混乱します。物理学の話のように。
このライブラリは、型変数を使用することで、特定のフィールド内ですべての操作を確実に実行するのに役立ちます。たとえば、上記のように denseVector&lt; Real&gt;
として宣言された v
が与えられた場合、 Complex
数で乗算しようとするとコンパイラは文句を言います。 。
他のヒント
これは一般的な戻り型です。 Java Genericsのチュートリアルについては、こちらをご覧ください。
これらはジェネリック型と呼ばれます。 Java 5で追加されており、C ++テンプレートに似ています。
アイデアは、一般的なものではなく、特定のタイプのアイテムのコレクションを定義することです。
これは、頻繁なダウンキャストを回避するのに役立ちます。古いJavaコードで、ベクトルにXのみが含まれることがわかっていると仮定します。そのコレクションからアイテムを取得したら、オブジェクトを取得するだけで、明示的にダウンキャストする必要がありました。
YをXのベクトルに入れることができないため、より安全であり、同じ理由で読みやすくなります。
「拡張」の背後にある物語これらの括弧で囲まれているのは、「Xとそのすべてのサブタイプ」のコレクションを定義できることです。 Xのサブタイプは受け入れますが、Yは拒否します。
public static <F extends Field<F>> DenseVector<F> valueOf(F... elements)
これを分解します:
public static
これはパブリックな静的メソッドです。
<F extends Field<F>>
任意のクラスFの汎用メソッドで、FはFieldの拡張です
DenseVector<F>
Fの(汎用)DenseVectorを返します
valueOf(F... elements)
valueOfという名前のメソッド。パラメーターは0個以上のFです。