gpt4 book ai didi

java - 为什么这些函数删除后类型相同?

转载 作者:行者123 更新时间:2023-12-02 01:48:18 25 4
gpt4 key购买 nike

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[...] 的泛型类型参数被删除(因此 XList[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 指出这一点)@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

关于java - 为什么这些函数删除后类型相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70639639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com