首页 > 解决方案 > 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。我怎样才能区分它们?

标签: scalagenerics

解决方案


问题与解决两个方法签名在擦除后变得相同的事实没有太大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是标准库的一部分,并且您始终拥有范围内的东西。只需在列表中添加更多虚拟对象,您也可以通过这种方式拥有两个以上的重载。


推荐阅读