【问题标题】:How to interpret this scala syntax "Class[_ >: Float with Int with Double]"如何解释这个scala语法“Class [_ >:Float with Int with Double]”
【发布时间】:2016-10-12 09:56:03
【问题描述】:

当我阅读 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 with Int with Double], Int]”是什么意思? 我了解可以在类声明期间使用 scala 关键字“with”,例如

Class person with glass { 

表示“人”类具有对象“玻璃”的特征。

如何解释上面代码中'with'的用法?

【问题讨论】:

    标签: scala syntax keyword mxnet


    【解决方案1】:

    with 关键字用于表达intersection types

    Float with Int with Double 类型基本上是FloatIntDouble 的子类型。当然你不能有这种类型的实际值,因为FloatIntDouble 都是最终类。这里,在Map[Class[_ >: Float with Int with Double], Int] 类型中,它用于表示Map 的每个键都必须是Class[T],其中T 必须是Float with Int with Double 的超类型。而这些超类型是FloatIntDouble(以及AnyValAny,如果我们在继承链上往上走的话)。

    【讨论】:

    • 那么它也可以是字符串吗,因为String是Any的子类型?
    • 什么是字符串?这里只有Class 对象。
    • 对不起,我指的是 String 类。
    • Class 是不变的,所以通常不是。 val c: Class[_ >: Float with Int with Double] = classOf[String] 无法编译。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 2017-03-12
    • 1970-01-01
    相关资源
    最近更新 更多