看似如下的Java方法:public static< F extends Field< F>> DenseVector&LT f是氟烃基; valueOf(F…元素)…它们是什么?
题
所以,我正在浏览一个java库(JScience)之后,有人在这里指出了我在java中获取向量(数学的,那就是)。
不幸的是,我以前从未见过生活中的任何事情:
public static <F extends Field<F>> DenseVector<F> valueOf(F... elements)
作为您可以在DenseVector类中调用的方法。那有什么意思。是否返回“&lt; F extends Field&lt; F&gt;&gt;
&quot; (如果是这样,为什么Eclipse认为它是一个输入?)
http:// jscience .ORG / API /组织/ jscience /数学/载体/ DenseVector.html#的valueOf(F ...)
这让我很困惑。我不能创建一个 new DenseVector()
,因为只有超类才有,并且它受到保护,并且尝试 DenseVector.valueOf()
显然只有在我工作时才有效给它...那......作为输入的奇怪之处。
我已经看到人们在尝试实例化对象(或类似的东西)时必须实例化方法......是那样的(或它是那样的吗?))API试图让我做什么? / p>
我有点困惑,我在学校学习了java(并且在工作中使用了一些,虽然我们除了java之外还使用了很多不同的东西),并且从未遇到过类似的东西。这是为了什么?它试图让我做什么?这是新的吗?旧?晦涩?
-Jenny
解决方案
您应该可以调用此方法来创建一个向量,如下所示:
Real r1 = Real.ONE, r2 = Real.valueOf(2D), r3 = Real.ZERO;
DenseVector<Real> v = valueOf(r1, r2, r3);
在此示例中,类型参数 F
是 Real
。 Real
服从约束“ extends Field&lt; F&gt;
&quot;因为它实现了 Field&lt; Real&gt;
。
对于不同的应用程序,可能会使用不同的字段。例如,安全应用程序可能使用 ModuloInteger
字段。这有点令人困惑,因为这是一个数学领域,而不是“矢量场”。就像在物理学中谈论一样。
通过使用类型变量,此库有助于确保在给定字段中执行所有操作。例如,如上所述声明为 DenseVector&lt; Real&gt;
的 v
,如果您尝试将其乘以 Complex
数字,编译器会抱怨
其他提示
这是一种通用的返回类型。有关Java Generics的教程,请参见此处。 / p>
这些称为通用类型。它们已经在Java 5中添加,类似于C ++模板。
这个想法是你定义一个特定类型的项目的集合,而不是一般的东西。
这可以帮助您避免频繁的向下转发。在较旧的Java代码中,假设您知道向量仅包含X.一旦您从该集合中检索了项目,您就会获得Object,并且您必须明确地向下转发它。
它也更安全,因为你不能将Ys放入Xs的矢量中,并且出于同样的原因更清楚地阅读。
“延伸”背后的故事在这些括号中,您可以定义“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
返回(通用)DenseVectorvalueOf(F... elements)
名为valueOf的方法,其中参数为零或更多Fs。