#scala #syntax #keyword #mxnet
#scala #синтаксис #ключевое слово #mxnet
Вопрос:
Когда я прочитал исходный код Mxnet, я был смущен следующими утверждениями:
object NDArray {
private val logger = LoggerFactory.getLogger(classOf[NDArray])
private[mxnet] val DTYPE_NATIVE_TO_MX: Map[Class[_ >: Float with Int with Double], Int] = Map(
classOf[Float] -> 0,
classOf[Double] -> 1,
classOf[Int] -> 4
)
Что это значит для «Class[_ >: Float с Int с Double], Int]»?
Я понимаю, что ключевое слово scala «with» может использоваться, например, при объявлении класса
Class person with glass {
означает, что класс ‘person’ имеет свойство объекта ‘glass’.
Как интерпретировать использование ‘with’ в приведенном выше коде?
Ответ №1:
with
Ключевое слово используется для выражения типов пересечений.
Тип Float with Int with Double
в основном является подтипом Float
and Int
и Double
. Конечно, у вас не может быть фактического значения этого типа, потому Float
что , Int
и Double
все являются конечными классами. Здесь, в типе Map[Class[_ >: Float with Int with Double], Int]
, он используется для выражения того, что каждый ключ Map
должен быть a Class[T]
, где T
должен быть супертипом Float with Int with Double
. И этими супертипами являются Float
, Int
и Double
(и AnyVal
и Any
, если мы поднимемся выше по цепочке наследования).
Комментарии:
1. Так может ли это быть также string , потому что String является подтипом Any ?
2. Что может быть строкой? Здесь есть только
Class
объекты.3. Извините, я имел в виду класс String .
4.
Class
инвариантен, поэтому обычно нет.val c: Class[_ >: Float with Int with Double] = classOf[String]
не компилируется.