将对象转换为类似类型

2024-01-10

在斯卡拉。我有两个 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(使用前将#替换为@)

将对象转换为类似类型 的相关文章

随机推荐