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

Итак, я просматриваю java-библиотеку (JScience) после того, как кто-то здесь хоть и указал мне на это для получения Векторов (то есть математических) в java.

К сожалению, я никогда не видел ничего в своей жизни, как:

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

как метод, который вы можете вызвать в классе DenseVector. Что это хотя бы значит. Это возвращает "<F extends Field<F>>"(и если так, почему" Затмение "думает, что это вход?)

http://jscience.org/api/org/jscience/mathematics/vector/DenseVector.html

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

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

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

-Дженни

4 ответа

Решение

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

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.

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.

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

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

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

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

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

Другие вопросы по тегам