gpt4 book ai didi

java - 将 Scala 数组与抽象类型结合使用

转载 作者:行者123 更新时间:2023-12-02 02:58:32 24 4
gpt4 key购买 nike

作为示例,这里是简化的代码。

trait DataType {
type DType
// more stuff
}

object IntType extends DataType {
type DType = Int
// more stuff
}

trait Codec {
val dtype: DataType
// more stuff
}

class DenseCodec(val dtype: DataType) extends Codec {
def get(size: Int) = new Array[dtype.DType](size)
}

val dense = new DenseCodec(IntType)

dense.get(4)

这不会编译:

找不到元素类型 DenseCodec.this.dtype.DType 的类标记
def get(size: Int) = new Array[dtype.DType](size)
^

我知道这与 Scala 中数组的特殊性有关。我可以在这里使用类似 Vector 的东西,它可以很好地工作,但是我正在从事的项目需要大量的数据处理,我希望保持尽可能的高效。

最佳答案

这会起作用

  def get(size: Int)(implicit tag: ClassTag[DataType]) = new Array[DataType](size)

或者使用等效的上下文绑定(bind)

  def get[DType: ClassTag](size: Int) = new Array[DType](size)

您甚至可以用模板 T 替换 DType

Array 的 构造函数实际上采用 ClassTag 类型的隐式参数,因此您需要隐式或显式提供一个参数。

编辑:还值得注意的是,使用dtype.DType将不起作用,因为dtypeDataType类型,没有具体的 DType 但只是一种抽象类型。有趣的是,dtype.type 可以正常工作,因为在运行时 val dtype: DataType 已经是 IntType

EDIT2:如果你想传播类型,恐怕唯一的方法就是使用类型类。

import scala.reflect.ClassTag

object Types {
trait DataType[A] {
// more stuff
}

object IntType extends DataType[Int]

object StringType extends DataType[String]

trait Codec[B] {
val dtype: DataType[B]
// more stuff
}

class DenseCodec[B](val dtype: DataType[B]) extends Codec[B] {
def get(size: Int)(implicit ct: ClassTag[B]) = new Array[B](size)
}

def main(args: Array[String]): Unit = {
val denseInt = new DenseCodec(IntType)
val arrInt = denseInt.get(4) //Array[Int]

val denseString = new DenseCodec(StringType)
val arrString = denseString.get(4) //Array[String]
}
}

这样您就可以摆脱 DType 并使用类型类的类型。您没有引入任何样板文件,因为您想要定义 IntType 以及可能更多的类型。希望这能解决您的问题:)

EDIT3:如果您想保留您的DType,只需选择

trait DataType[A] {
type DType = A
// more stuff
}

并修改get定义

def get(size: Int)(implicit ct: ClassTag[B]) = new Array[dtype.DType](size)

但是这样你将拥有一个从 IntTypeStringType 等派生的长类型签名。

关于java - 将 Scala 数组与抽象类型结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42720923/

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