Методы 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.