在斯卡拉。我有两个 Any 类型的对象。如果可能的话,我想将对象转换为正确的 Ordered 特征,然后将它们与
你可以通过以下方式实现Ordering
类型类别:
def compare[T : Ordering : Manifest](a: AnyRef, b: AnyRef) = {
val c = manifest[T].erasure
if (c.isAssignableFrom(a.getClass) && c.isAssignableFrom(b.getClass))
implicitly[Ordering[T]].compare(a.asInstanceOf[T], b.asInstanceOf[T])
else
throw new IllegalArgumentException("Wrong argument type")
}
然后像这样使用它:
compare[Date](new Date, new Date)
compare[String]("A", "B")
但是这段代码会抛出IllegalArgumentException
:
compare[Date]("A", "B")
Update
如果您确实不知道要比较的对象的类型,那么您可以使用以下解决方案:
def compare(a: AnyRef, b: AnyRef) = {
val c = classOf[Comparable[_]]
if (c.isAssignableFrom(a.getClass) && c.isAssignableFrom(a.getClass) && a.getClass == b.getClass) {
a.asInstanceOf[Comparable[AnyRef]].compareTo(b.asInstanceOf[Comparable[AnyRef]])
} else {
throw new IllegalArgumentException("Incopatible argument types: " + a.getClass.getName + " and " + b.getClass.getName)
}
}
它归结为Java的Comparable
界面。一般来说,scala 有 2 个特征用于此目的:
-
Ordred
- 如同Comparable
,但是现有的类(例如String
or Date
)不实现它,所以你无法在运行时检查它(至少对于这些类)
-
Ordering
- 它是类型类,您无法在运行时检索它。
从另一方面Ordered
延伸Comparable
接口,所以这个解决方案也应该适用于扩展的所有类Ordered
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)