Как интерпретировать этот синтаксис scala «Class[_ >: Float с Int с Double]»

#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] не компилируется.