为什么这些函数擦除后类型相同?
Why do these functions have the same type after erasure?
def merge[X](list1: Option[List[X]], list2: Option[List[X]]): Option[List[X]]
def merge[X](list1: Option[List[X]], elem: Option[X]): Option[List[X]]
编译器说这两个函数在擦除后具有相同的类型
def merge[X](list1: Option[List[X]],list2: Option[List[X]]): Option[List[X]] at line 122 and
def merge[X](list1: Option[List[X]],elem: Option[X]): Option[List[X]] at line 131
have same type after erasure: (list1: Option, list2: Option)Option
为什么擦除后Option[List[X]]
和Option[X]
变成一样了?
我怎样才能让它们与众不同?
- 为什么擦除后
Option[List[X]]
和Option[X]
变成一样了?
因为 Option[...]
的通用类型参数被擦除(因此 X
和 List[X]
都被擦除)所以这两个方法将具有相同的签名。
- 我怎样才能让它们与众不同?
一种方法 - 向其中一种方法添加虚拟隐式参数,使它们具有不同的签名:
def merge[X](list1: Option[List[X]], list2: Option[List[X]]): String = "1"
def merge[X](list1: Option[List[X]], elem: Option[X])(implicit d: DummyImplicit): String = "2"
println(merge(Some(List(1)), Some(List(2)))) // 1
println(merge(Some(List(1)), Some(2))) // 2
对于 Scala 3(感谢 @Gaël J for pointing that out) @targetName
注释可以用来解决歧义:
import scala.annotation.targetName
def merge[X](list1: Option[List[X]], list2: Option[List[X]]): String = "1"
@targetName("merge_element")
def merge[X](list1: Option[List[X]], elem: Option[X]): String = "2"
println(merge(Some(List(1)), Some(List(2)))) // 1
println(merge(Some(List(1)), Some(2))) // 2
def merge[X](list1: Option[List[X]], list2: Option[List[X]]): Option[List[X]]
def merge[X](list1: Option[List[X]], elem: Option[X]): Option[List[X]]
编译器说这两个函数在擦除后具有相同的类型
def merge[X](list1: Option[List[X]],list2: Option[List[X]]): Option[List[X]] at line 122 and
def merge[X](list1: Option[List[X]],elem: Option[X]): Option[List[X]] at line 131
have same type after erasure: (list1: Option, list2: Option)Option
为什么擦除后Option[List[X]]
和Option[X]
变成一样了?
我怎样才能让它们与众不同?
- 为什么擦除后
Option[List[X]]
和Option[X]
变成一样了?
因为 Option[...]
的通用类型参数被擦除(因此 X
和 List[X]
都被擦除)所以这两个方法将具有相同的签名。
- 我怎样才能让它们与众不同?
一种方法 - 向其中一种方法添加虚拟隐式参数,使它们具有不同的签名:
def merge[X](list1: Option[List[X]], list2: Option[List[X]]): String = "1"
def merge[X](list1: Option[List[X]], elem: Option[X])(implicit d: DummyImplicit): String = "2"
println(merge(Some(List(1)), Some(List(2)))) // 1
println(merge(Some(List(1)), Some(2))) // 2
对于 Scala 3(感谢 @Gaël J for pointing that out) @targetName
注释可以用来解决歧义:
import scala.annotation.targetName
def merge[X](list1: Option[List[X]], list2: Option[List[X]]): String = "1"
@targetName("merge_element")
def merge[X](list1: Option[List[X]], elem: Option[X]): String = "2"
println(merge(Some(List(1)), Some(List(2)))) // 1
println(merge(Some(List(1)), Some(2))) // 2