Если вы хотите добиться этого с помощью регулярного выражения, вы можете использовать.
^(\d*\.)?\d+$
Но учтите, что вы также можете использовать Decimal.TryParse
. Вы можете прочитать больше о Decimal.TryParse здесь
super
для привязки параметра именованного типа (например,
) в отличие от подстановочного символа (например, super T>
) является НЕЗАКОННЫМ просто потому, что даже если он разрешен, он не будет делать то, что вы надеялся, что это сработает, потому что, поскольку Объект
является конечным супер
из всех ссылочных типов, а все является Объектом
, , по сути, нет никаких ограничений .
В вашем конкретном примере, поскольку любой массив ссылочного типа является Object []
(по ковариации массива Java), его можно использовать в качестве аргумента для
(если такая привязка допустима) во время компиляции, и это не предотвратит S [] toArray (S [] a) ArrayStoreException
во время выполнения.
Вы пытаетесь предложить следующее:
List<Integer> integerList;
и учитывая это гипотетическое супер
, привязанное к toArray
:
<S super T> S[] toArray(S[] a) // hypothetical! currently illegal in Java
компилятор должен разрешать только следующие для компиляции:
integerList.toArray(new Integer[0]) // works fine!
integerList.toArray(new Number[0]) // works fine!
integerList.toArray(new Object[0]) // works fine!
и никаких других аргументов типа массива (поскольку Integer
имеет только эти 3 типа как super
). То есть вы пытаетесь предотвратить компиляцию:
integerList.toArray(new String[0]) // trying to prevent this from compiling
, потому что по вашему аргументу String
не является super
из Integer
. Однако , Объект
является супер
из Integer
, а String []
является объектом []
, поэтому компилятор по-прежнему позволит компилировать вышеупомянутое, даже если гипотетически вы можете выполнить
!
Таким образом, следующий по-прежнему будет компилироваться (так же, как и сейчас), а ArrayStoreException
во время выполнения не может быть предотвращено какой-либо проверкой времени компиляции с использованием универсального границы типов:
integerList.toArray(new String[0]) // compiles fine!
// throws ArrayStoreException at run-time
Обобщения и массивы не смешиваются, и это одно из многих мест, где это показано.
Снова допустим, что у вас есть это объявление общего метода:
<T super Integer> void add(T number) // hypothetical! currently illegal in Java
И у вас есть эти объявления переменных:
Integer anInteger
Number aNumber
Object anObject
String aString
Ваше намерение с
(если это разрешено), это то, что он должен разрешать добавить (anInteger)
и добавить (aNumber)
, и, конечно, добавить (anObject)
, но НЕ добавить (aString)
. Что ж, String
- это объект
, поэтому add (aString)
все равно будет компилироваться.
О правилах набора обобщенных типов:
List animals = new ArrayList ()
? List
отличается от List
, который отличается от List >
При использовании super
и extends
:
Java Generics: что такое PECS?
расширяет
потребитель super
» super
и extends
в Java Generics
и
? расширяет структуры данных Number>
? (НЕЛЬЗЯ!) Мне действительно нравится принятый ответ, но я хотел бы поместить немного отличающийся взгляд на него.
super
поддерживается во введенном параметре только для разрешения контравариантность возможности. Когда дело доходит до [1 111] ковариантность и контравариантность важно понять, что Java только поддерживает различие сайта использования . В отличие от Kotlin или Scala, которые позволяют различие сайта объявления . Документация Kotlin объясняет это очень хорошо здесь . Или если Вы больше в Scala, здесь один для Вас.
Это в основном означает, что в Java, Вы не можете ограничить способ, которым Вы собираетесь использовать свой класс, когда Вы объявляете это с точки зрения ПЕЧА. Класс может и использовать и произвести, и некоторые его методы могут сделать это одновременно, как toArray([])
, между прочим.
Теперь, причина extends
позволяется в классах, и объявления методов то, потому что это - больше приблизительно [1 115] полиморфизм , чем это - приблизительно [1 116] различие . И полиморфизм является внутренней частью Java и ООП в целом: , Если метод может принять некоторый супертип, подтип может всегда безопасно передаваться ему. И если метод, на сайте объявления, поскольку это - "контракт", должен возвратить некоторый супертип, хорошо полностью, если это возвращает подтип вместо этого в его реализациях