scala - 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
我当前的用例是:我希望能够重新定义给我的任意对象的等号/哈希码(我无法真正摆脱这一点,因为我必须将对象传递给一些有缺陷的框架将使用这些对象的等号/哈希码,所以我无法控制)。显而易见的方法是通过继承。有没有办法做到这一点?
解决方案
一般情况下肯定是不可能的。
假设我为 传递了一个final
类型B
,例如String
. 没有办法对其进行子类化。所以,你不能随意做B
。
根据这个其他框架的工作方式,您可以改为传递它AnyRef
。否则,您可能可以使用宏完成某些操作,但需要更多信息来确定这一点。
推荐阅读
- node.js - 可以将 Socket.IO 客户端设置为不阻止 NodeJS 退出吗?
- jquery - 在jquery中组合多个函数
- python - 通过单击 tkinter python 中的按钮更新标签文本
- python - 如何迭代每个列名并将其附加到python中的表或数据框中
- javascript - 将新对象添加到数组中到nodeJS中的js文件中
- node.js - 应用程序崩溃 - 在 nodejs 中启动之前等待文件更改
- windows - Docker for windows:安装到容器后无法删除目录
- ios - 斯坦福 CS193p - 根据卡数更改字体大小?
- ios - 我如何通过其记录名称查询 CloudKit 以获取特定记录?
- python - 如何解决builtins.pyi 中的问题?