首页 > 解决方案 > Scala 是否允许任意实例化泛型对象?新乙{}?

问题描述

我想知道这样的事情是否可以在 Scala 中实现:

def f[B <: AnyRef]()(implicit ct: ClassTag[B]): B = {
  new B {
    override def equals(o: Any) = ...
    override def hashcode(o: Any) = ...
  }
}

我的直觉是,即使使用ClassTag也不应该实例化一个任意的B,因为我们不知道它是否甚至有一个无参数参数。

但我得到的实际错误是:

class type required but B found

我当前的用例是:我希望能够重新定义给我的任意对象的等号/哈希码(我无法真正摆脱这一点,因为我必须将对象传递给一些有缺陷的框架将使用这些对象的等号/哈希码,所以我无法控制)。显而易见的方法是通过继承。有没有办法做到这一点?

标签: scala

解决方案


一般情况下肯定是不可能的。

假设我为 传递了一个final类型B,例如String. 没有办法对其进行子类化。所以,你不能随意做B

根据这个其他框架的工作方式,您可以改为传递它AnyRef。否则,您可能可以使用宏完成某些操作,但需要更多信息来确定这一点。


推荐阅读