Методы Java, которые выглядят как:общедоступный статический <F extends="" Field<F="">> Вектор плотности<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.Что... это вообще значит.Возвращает ли это "<F extends Field<F>>" (и если да, то почему Eclipse думает, что это входные данные?)

http://jscience.org/api/org/jscience/mathematics/vector/DenseVector.html#valueOf (F...)

Это действительно сбивает меня с толку.Я не могу сделать new DenseVector() потому что только суперкласс обладает этим, и он защищен, и пытается сделать DenseVector.valueOf() очевидно, работает только в том случае, если я даю ему ... эту ... странную вещь в качестве входных данных.

Я видел, как людям приходилось создавать экземпляры методов при попытке создать экземпляры объектов (или что-то в этом роде) ... это похоже на это (или это так?)) Что API пытается заставить меня сделать?

Я немного смущен тем, что я изучал java в школе (и немного использовал его на работе, хотя мы используем много разных вещей, помимо просто Java), и никогда не сталкивался ни с чем подобным.Для чего это нужно?Что он пытается заставить меня сделать?Это что-то новое?Старый?Непонятный?

-Дженни

Это было полезно?

Решение

Вы должны иметь возможность вызвать этот метод для создания вектора, подобного этому:

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

Для различных применений, различных поля скорее всего, будут использованы.Например, приложения безопасности могут использовать ModuloInteger поле.Это немного сбивает с толку, потому что это математическое поле, а не "векторное поле", о котором говорят в физике.

Используя переменные типа, эта библиотека помогает убедиться, что вы выполняете все операции в пределах данного поля.Например, учитывая v объявленный в качестве DenseVector<Real> как и выше, компилятор будет жаловаться, если вы попытаетесь умножить его на Complex число.

Другие советы

Это общий возвращаемый тип.Видишь здесь для руководства по Java Generics.

Они называются универсальными типами.Они были добавлены в Java 5 и похожи на шаблоны C ++.

Идея заключается в том, что вы определяете коллекцию элементов определенного типа, а не что-то общее.

Это поможет вам избежать частых понижающих передач.В более старом коде Java предположим, что вы знали, что ваш вектор будет содержать только X.Как только вы извлекали элементы из этой коллекции, вы просто получали Object , и вам приходилось явно удалять его.

Это также безопаснее, потому что вы не можете поместить Ys в вектор Xs, и понятнее для чтения по тем же причинам.

История, стоящая за "extends" в этих скобках, заключается в том, что вы можете определить коллекции "Xs и все их подтипы", которые по-прежнему будут принимать подтипы X, но отвергать Y.

public static <F extends Field<F>> DenseVector<F> valueOf(F... elements)

Давайте разберем это пополам:

public static

Это общедоступный статический метод.

<F extends Field<F>>

Это универсальный метод для любого класса F, где F - расширение поля

DenseVector<F>

Он возвращает (общий) вектор плотности для F

valueOf(F... elements)

Метод с именем valueOf, параметры которого равны нулю или более Fs.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top