1

所以,我正在浏览一个 java 库(JScience),因为这里有人深思熟虑地指出我在 java 中获取向量(即数学的)。

不幸的是,我以前从未见过这样的事情:

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),从来没有遇到过这样的事情。这是为了什么?它想让我做什么?这是新的吗?老的?朦胧?

-珍妮

4

4 回答 4

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>.

对于不同的应用,可能会用到不同的字段。例如,安全应用程序可能会使用该ModuloInteger字段。这有点令人困惑,因为这是一个数学领域,而不是像物理学中所说的“向量场”。

通过使用类型变量,该库有助于确保您在给定字段内执行所有操作。例如,给定v声明为上述DenseVector<Real>类似,如果您尝试将其乘以一个Complex数字,编译器会报错。

于 2009-10-27T19:57:44.707 回答
3

这是一个通用的返回类型。有关 Java 泛型的教程,请参见此处

于 2009-10-27T19:45:28.897 回答
1

这些被称为通用类型。它们已在 Java 5 中添加,类似于 C++ 模板。

这个想法是您定义特定类型的项目集合,而不是一般的项目。

这可以帮助您避免频繁的向下转换。在较旧的 Java 代码中,假设您知道向量将只包含 X。一旦您从该集合中检索项目,您将只获得 Object,并且您必须显式地向下转换它。

它也更安全,因为您不能将 Ys 放入 Xs 的向量中,并且出于相同的原因阅读起来更清晰。

这些括号中“扩展”背后的故事是,您可以定义“X 及其所有子类型”的集合,这些集合仍然接受 X 的子类型但拒绝 Y。

于 2009-10-27T19:49:08.560 回答
1
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 的方法,其中参数是零个或多个 Fs。

于 2009-10-27T20:38:54.373 回答