我有一些问题要将Variable[A]
投放到A <: Array[_]
我创建了一个函数来比较manifest
并将数据转换为数组到良好类型。
我的对象Variable[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)
myVariable.value
包含Array[Double]
当我println()
两个清单时:
Array[double]
Array[Double]
似乎Array[Double]
不是Array[double]
,我该如何解决/投这个?
答案 0 :(得分:1)
这开始是一个评论,因为它不是一个答案,但它太大而且需要格式化(加上我的浏览器标签的自动重载导致它第一次丢失......)
所以......对于初学者来说,你的代码片段不完整和/或不正确。可能存在有效的导入可能会改变该代码的含义。其次,如图所示它不会编译'因为看起来似乎是正式的类型参数,A
没有绑定。因此,除非您有一个名为A
的实际类型无法编译。
其次,Double
可能含糊不清。有scala.Double
和java.lang.Double
,它们是截然不同的。 Scala自动框和-unboxes原始类型,通常在它们用于实例化泛型方法的类型参数时(并且不使用特化)。这样做的结果是Array[scala.Double]
与Array[java.lang.Double]
不同。 Scala会在可能的情况下创建基本类型的数组,但Array[java.lang.Double]
显式是一个盒装双精度浮点数组。
E.g:
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;
所以,如果你愿意,请填写示例代码中缺少的详细信息?
答案 1 :(得分:0)
最后,借助同事方法来反复使用unArrayify数组,我解决了我的运行时类型设置问题。现在我可以比较Array[double]
与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
并在源forge项目上: