scala - Scala中参数限制为AnyRef和AnyVal时的冲突方法
问题描述
Scala 编译器将以下两个map
函数检测为相互冲突的重复项:
class ADT {
def map[Output <: AnyVal](f: Int => Output): List[Output] = ???
def map[Output >: Null <: AnyRef](f: Int => Output): List[Output] = ???
}
参数的类类型Output
不同。第一个限制为AnyVal
,第二个限制为AnyRef
。我怎样才能区分它们?
解决方案
问题与解决两个方法签名在擦除后变得相同的事实没有太大AnyVal
区别。AnyRef
这是解决此类问题的巧妙技巧。它类似于@som-snytt 所做的,但更通用一些,因为它也适用于其他类似情况(例如def foo(f: Int => String): String = ??? ; def foo(f: String => Int): Int = ???
等):
class ADT {
def map[Output <: AnyVal](f: Int => Output): List[Output] = ???
def map[Output >: Null <: AnyRef](f: Int => Output)(implicit dummy: DummyImplicit): List[Output] = ???
}
最可爱的是它“开箱即用”。显然, aDummyImplicit
是标准库的一部分,并且您始终拥有范围内的东西。只需在列表中添加更多虚拟对象,您也可以通过这种方式拥有两个以上的重载。
推荐阅读
- sql-server - 漏洞是 MSSQL 语句
- javascript - 菜单打开时如何禁止正文滚动
- javascript - 计算表col中价格的总成本,可以手动插入
- javascript - Angular:在每一行上拆分json数据
- terraform - 向 Terraform 脚本添加条件布尔值
- karate - 如何在空手道 API 中参数化 Cookie?
- java - 我们如何使用 gson.JsonObject 在非静态 java 方法/类中创建 Json
- java - 如何将很多位图合并为一个
- java - 通过命令行覆盖 Surefire 配置
- php - 更新:如何参数化具有“IN”子句的查询?