Методы Java, которые выглядят следующим образом: public static <F extends Field <F>> DenseVector <F>valueOf (F ... elements) ... что это такое? - PullRequest
1 голос
/ 27 октября 2009

Итак, я просматриваю 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), и никогда не сталкивался с чем-то подобным. Для чего это? Что он пытается заставить меня сделать? Это новое? Старый? Obscure

-Jenny

Ответы [ 4 ]

4 голосов
/ 27 октября 2009

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

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 число.

3 голосов
/ 27 октября 2009

Это тип возвращаемого значения. См. здесь для учебника по Java Generics.

1 голос
/ 27 октября 2009
public static <F extends Field<F>> DenseVector<F> valueOf(F... elements)

Давайте разберемся с этим:

public static

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

<F extends Field<F>>

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

DenseVector<F>

Возвращает (универсальный) DenseVector для F

valueOf(F... elements)

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

1 голос
/ 27 октября 2009

Это так называемые общие типы. Они были добавлены в Java 5 и похожи на шаблоны C ++.

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

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

Это также безопаснее, потому что вы не можете поместить Y в вектор X, и чище читать по тем же причинам.

История, стоящая за «расширениями» в этих скобках, заключается в том, что вы можете определить наборы «X и всех их подтипов», которые все равно будут принимать подтипы X, но отклонять Y.

...