看似如下的Java方法:public static< F extends Field< F>> DenseVector&LT f是氟烃基; valueOf(F…元素)…它们是什么?

StackOverflow https://stackoverflow.com/questions/1633211

  •  06-07-2019
  •  | 
  •  

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top