看似如下的Java方法:public static <f extends =“”field <f =“”>&gt; DenseVector <f> valueOf(F ...元素)......它们是什么?</f> </f>

时间:2009-10-27 19:43:41

标签: java jscience

所以,我正在浏览一个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

4 个答案:

答案 0 :(得分:4)

您应该可以调用此方法来创建一个向量,如下所示:

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

在此示例中,类型参数FRealReal遵守约束“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

返回(通用)DenseVector
valueOf(F... elements)

名为valueOf的方法,其中参数为零或更多Fs。