scala – 编译器无法识别函数重载,因为类型被擦除.怎么克服这个
发布时间:2020-12-16 18:41:14 所属栏目:安全 来源:网络整理
导读:我有一个问题,下面的代码中名为fooSome的两个方法不能编译,因为编译器报告重复的方法名称有问题: class Foo() { // variable block has 2 closure variables def fooSome(block: Some[(Int,String) = Unit]) = { } // variable block has 1 closure variabl
我有一个问题,下面的代码中名为fooSome的两个方法不能编译,因为编译器报告重复的方法名称有问题:
class Foo() { // variable block has 2 closure variables def fooSome(block: Some[(Int,String) => Unit]) = { } // variable block has 1 closure variables def fooSome(block: Some[Int => Unit]) = { } // variable block has 2 closure variables def fooNoSome(block: (Int,String) => Unit) = { } // variable block has 1 closure variables def fooNoSome(block: Int => Unit) = { } } 相反,编译器报告没有与名为fooNoSome的两个方法发生此类方法名称冲突.所以问题是编译器没有看到“Some [(Int,String)=> Unit]”和“Some [(Int)=> Unit]”之间的区别,而“(Int,String)=> ;对于fooNoSome方法,单位“被视为与”(Int)=>单位“不同的签名. 我可以通过创建一个用于“Some [(Int,String)=> Unit]”案例的Some2Args类和用于“Some [(Int)=> Unit]”案例的Some1Arg类来解决这个问题. 我的问题是,是否有更优雅,更省力的解决方案. 解决方法
编译器确实看到它们之间存在差异,不允许在重载中使用这种差异(因为某些[(Int,String)=> Unit]和某些[Int => Unit]的擦除是相同的并且JVM当参数的擦除相同时不允许重载).解决方案是添加伪隐式参数:
class Foo() { def fooSome(block: Some[(Int,String) => Unit]) = { } def fooSome(block: Some[Int => Unit])(implicit d: DummyImplicit) = { } } 另请注意,fooNoSome的删除是fooNoSome(Function2)和fooNoSome(Function1),所以如果你想添加另一个带有一个或两个参数的函数的重载,你需要再次使用DummyImplicit技巧: def fooNoSome(block: Double => Unit)(implicit d: DummyImplicit) = ... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |