所以,我正在浏览一个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试图让我做什么? / p>
我有点困惑,我在学校学习了java(并且在工作中使用了一些,虽然我们除了java之外还使用了很多不同的东西),并且从未遇到过这样的事情。这是为了什么?它试图让我做什么?这是新的吗?旧?晦涩?
-Jenny
答案 0 :(得分:4)
您应该可以调用此方法来创建一个向量,如下所示:
Real r1 = Real.ONE, r2 = Real.valueOf(2D), r3 = Real.ZERO;
DenseVector<Real> v = valueOf(r1, r2, r3);
在此示例中,类型参数F
为Real
。 Real
遵守约束“extends Field<F>
”,因为它实现了Field<Real>
。
对于不同的应用程序,可能会使用不同的fields。例如,安全应用程序可能使用ModuloInteger
字段。这有点令人困惑,因为这是一个数学领域,而不是像物理学中谈到的“矢量场”。
通过使用类型变量,此库有助于确保在给定字段中执行所有操作。例如,如上所述,v
被声明为DenseVector<Real>
,如果您尝试将其乘以Complex
数字,编译器会抱怨。
答案 1 :(得分:3)
这是一种通用的返回类型。有关Java Generics的教程,请参阅here。
答案 2 :(得分:1)
这些称为通用类型。它们已经在Java 5中添加,类似于C ++模板。
这个想法是你定义一个特定类型的项目的集合,而不是一般的东西。
这可以帮助您避免频繁的向下转发。在较旧的Java代码中,假设您知道向量仅包含X.一旦您从该集合中检索了项目,您就会获得Object,并且您必须明确地向下转发它。
它也更安全,因为你不能将Ys放入Xs的矢量中,并且出于同样的原因更清楚地阅读。
这些括号中“扩展”背后的故事是,您可以定义“X及其所有子类型”的集合,这些集合仍将接受X的子类型但拒绝Y.
答案 3 :(得分:1)
public static <F extends Field<F>> DenseVector<F> valueOf(F... elements)
让我们打破这个:
public static
它是一种公共静态方法。
<F extends Field<F>>
它是任何F类的通用方法,其中F是Field
的扩展DenseVector<F>
它为F
返回(通用)DenseVectorvalueOf(F... elements)
名为valueOf的方法,其中参数为零或更多Fs。