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可以有你不知道要定义的抽象方法).但
建议不同的签名: def f[B <: AnyRef](x: B): B = ... 这个是可行的.当然有限制.如果B是接口,则可以使用dynamic proxies from Java standard library, 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 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |