1

我有一些问题将我的对象投射到Variable[A]哪里A <: Array[_]

我创建了一个函数来比较manifest数据并将其转换为 Array 到好的类型。

我的对象Variable[A]将 a 存储Manifest[A]到 def'type'

我制作了一个现有软件的插件,所以不是我Variable用好的类型来实例化它。

原型对象和类:

object Prototype {
  def apply[T](n: String)(implicit t: Manifest[T]) = new Prototype[T] {
    val name = n
    val `type` = t
  }
}

trait Prototype[T] {
  def name: String
  def `type`: Manifest[T]
}

变量对象和类:

object Variable {
  def apply[T](p: Prototype[T], v: T) = new Variable[T] {
    val prototype = p
    val value = v
  }
}

trait Variable[T] {
  def prototype: Prototype[T]
  def value: T
}

我的班级使用:

class XYDataReader[A <: Array[_]](var data: Iterable[Variable[A]]) {

    def get[T](variable: Variable[A])(implicit m: Manifest[T]): Option[T] = {
        if (variable.prototype.`type` <:< m) {
          Some(variable.value.asInstanceOf[T])
        } else {
          None
        } 
}
}

当我实例化用于比较的变量对象时,我可能有一个错误,所以我也给出了实例化的代码:

val v:List[Any] = List[Any](1.2,2,3)
val p = Prototype[Array[Any]]("col1")
val myVariable = Variable(p, v.toArray(ClassTag(p.`type`.runtimeClass)))

我不明白为什么当我调用get[Array[Double]](myVariable)where myVariable.valuecontains an时模式匹配失败Array[Double]

当我println()两个清单时:

  • 变量数组类型:Array[double]
  • 米型:Array[Double]

似乎Array[Double]不是Array[double],我该如何解决/投射这个?

4

2 回答 2

1

这开始是一个评论,因为它不是一个答案,但它太大并且需要格式化(加上我的浏览器选项卡的自动重新加载导致它第一次丢失......)

所以...对于初学者来说,您的代码片段不完整和/或不正确。可能存在有效的导入,这可能会改变该代码的含义。其次,如图所示,它不会编译,因为看起来是正式的类型参数,A没有绑定。因此,除非您有一个A不会编译的实际类型。

其次,Double可能是模棱两可的。两者都有scala.Doublejava.lang.Double而且它们是不同的。Scala 为您自动装箱和取消装箱原始类型,通常在它们用于实例化泛型方法的类型参数时(并且不使用专门化)。其结果Array[scala.Double]是与 不同Array[java.lang.Double]。Scala 将在可能的情况下创建原始类型Array[java.lang.Double]的数组,但显式地是一个盒装双精度浮点数组。

例如:

scala> val d1: scala.Double = 123.456
d1: Double = 123.456

scala> val d2: java.lang.Double = 234.567
d2: Double = 234.567

scala> d1.getClass
res25: Class[Double] = double

scala> d2.getClass
res26: Class[_ <: Double] = class java.lang.Double

scala> val ad1: Array[scala.Double] = Array(123.456, 234.567)
ad1: Array[Double] = Array(123.456, 234.567)

scala> val ad2: Array[java.lang.Double] = Array(234.567, 345.678)
ad2: Array[Double] = Array(234.567, 345.678)

scala> ad1.getClass
res27: Class[_ <: Array[Double]] = class [D

scala> ad2.getClass
res28: Class[_ <: Array[Double]] = class [Ljava.lang.Double;

因此,如果您愿意,请填写您的示例代码中缺少的详细信息?

于 2013-01-23T16:48:01.580 回答
0

最后,在同事方法的帮助下递归地 unArrayify Array,我解决了我的运行时类型具体化问题。Array[double]现在我可以比较with之间的相等性Array[Double]

  // Convert unknow A en Array[T], so you need to call get with Type :
  // example : get[Array[Double](myVariable)
  // return an Array[Double] only if it's possible for this Variable, else it return None
  def get[T](variable: Variable[A])(implicit m: Manifest[T]): Option[T] = {
    if (ClassUtils.assignable(variable.prototype.`type`.runtimeClass, m.runtimeClass)) {
      val casted = variable.prototype.`type`.runtimeClass.cast(variable.value)
      Some(casted.asInstanceOf[T])
    } else {
      None
    }

我希望这些方法可以帮助其他人:)

你可以在这里看到帮助方法ClassUtils.assignable

https://gist.github.com/4686167

并在源伪造项目上:

https://forge.iscpif.fr/projects/openmole/repository/revisions/master/entry/core/openmole/misc/org.openmole.misc.tools/src/main/scala/org/openmole/misc/tools/ obj/ClassUtils.scala

于 2013-01-31T20:38:17.090 回答