加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala是否允许对通用对象进行任意实例化?新的B {}?

发布时间:2020-12-16 18:19:23 所属栏目:安全 来源:网络整理
导读:我想知道在 Scala中是否可以实现这样的东西: def f[B : AnyRef]()(implicit ct: ClassTag[B]): B = { new B { override def equals(o: Any) = ... override def hashcode(o: Any) = ... }} 我的直觉是,即使使用ClassTag,也不可能实例化任意B,因为我们不知道
我想知道在 Scala中是否可以实现这样的东西:

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

我的直觉是,即使使用ClassTag,也不可能实例化任意B,因为我们不知道它是否具有no-args参数.

但我得到的实际错误是:

class type required but B found

我当前的用例是:我希望能够重新定义给我的任意对象的equals / hashcode(我无法真正摆脱它,因为我将把对象传递给一些错误的框架,将使用这些对象的equals / hashcodes,所以我无法控制它.
显而易见的方法是通过继承.有没有办法做到这一点?

解决方法

Brian回答标题中的问题(你也可以认为B可以有你不知道要定义的抽象方法).但

I want to be able to redefine the equals/hashcode of arbitrary objects that are given to me

建议不同的签名:

def f[B <: AnyRef](x: B): B = ...

这个是可行的.当然有限制.如果B是接口,则可以使用dynamic proxies from Java standard library,
对于类,您需要一个像CGLIB这样的库.大约(未经测试):

def f[B <: AnyRef](x: B): B = {
  val enhancer = new Enhancer()
  enhancer.setSuperclass(x.getClass)
  val interceptor: MethodInterceptor = (obj,method,args,proxy) =>
    method.getName match {
      case "equals" => // your equals impl 
      case "hashCode" => // your hashCode impl 
      case _ => proxy.invokeSuper(obj,args)
    }
  enhancer.setCallback(interceptor)
  enhancer.create() as B
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读