gpt4 book ai didi

scala - 如何在 Scala 中在运行时检查我是否在 @specialized 函数或类中?

转载 作者:行者123 更新时间:2023-12-01 04:59:51 25 4
gpt4 key购买 nike

假设我有一个专门的类和一个关联的伴生对象:

trait Slice[@specialized +T] {
...

override def equals(that :Any) = that match {
case s :Slice[_] => ???
case _ => false
}
}

object Slice {
def newInstance[@specialized T] = ???
}
有什么办法可以查
  • 如果此实例是专门的子类,则在 Slice 的方法中,
  • 在 Slice 的方法中,如果另一个实例是同一原语的特殊子类,
  • 如果我正在运行已删除或专用变体,则在伴随对象的专用方法中

  • 不诉诸 ClassTags 或手动传递 Class[_]?似乎该信息应该可用,但我能想到的唯一方法是检查类的名称。
    用例 2) 特别重要,因为如果我知道我在比较苹果和苹果,我可以求助于更快的算法。它可能可以通过反射来完成,但是当您考虑到我们也必须处理 Slice 的非合成子类时,这将非常棘手;如果我们也有
    trait ArraySlice[@specialized T] extends Slice[T] { ... }
    只要它们都是专门的(或都被删除),就应该被认为与 Slice[T] 实例“兼容”?

    最佳答案

    好吧,我想出了一个更清洁的方法:

    final val AllButUnit = new Specializable.Group((Byte, Short, Int, Long, Char, Float, Double, Boolean, AnyRef))

    def specializationFor[@specialized(AllButUnit) E] :ResolvedSpecialization[E] =
    Specializations(new SpecializedKey[E]).asInstanceOf[ResolvedSpecialization[E]]


    private val Specializations = Seq(
    resolve[Byte],
    resolve[Short],
    resolve[Int],
    resolve[Long],
    resolve[Char],
    resolve[Float],
    resolve[Double],
    resolve[Boolean],
    resolve[Unit],
    resolve[AnyRef]
    ).map(
    spec => spec.key -> spec :(SpecializedKey[_], ResolvedSpecialization[_])
    ).toMap.withDefaultValue(resolve[AnyRef])

    private def resolve[@specialized(AllButUnit) E :ClassTag] :ResolvedSpecialization[E] =
    new ResolvedSpecialization[E](new SpecializedKey[E], new Array[E](0))


    class ResolvedSpecialization[@specialized(AllButUnit) E] private[SpecializedCompanion]
    (val array :Array[E], val elementType :Class[E], val classTag :ClassTag[E], private[SpecializedCompanion] val key :SpecializedKey[E])
    {
    private[SpecializedCompanion] def this(key :SpecializedKey[E], array :Array[E]) =
    this(array, array.getClass.getComponentType.asInstanceOf[Class[E]], ClassTag(array.getClass.getComponentType.asInstanceOf[Class[E]]), key)

    override def toString = s"@specialized($elementType)"

    override def equals(that :Any) = that match {
    case r :ResolvedSpecialization[_] => r.elementType==elementType
    case _ => false
    }

    override def hashCode = elementType.hashCode
    }

    private class SpecializedKey[@specialized(AllButUnit) E] {
    override def equals(that :Any) = that.getClass==getClass
    override def hashCode = getClass.hashCode

    def className = getClass.getName
    override def toString = className.substring(className.indexOf("$")+1)
    }

    现在 specializationFor[E].elementType返回对应于 E 的特化参数的类。

    关于scala - 如何在 Scala 中在运行时检查我是否在 @specialized 函数或类中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33964134/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com