scala – “参数化重载隐式方法作为视图边界不可见”编译器警告
我声明了两个实用方法是隐式的
class MyClass { ... } object MyClass { implicit def finish: MyClass[Any,Nothing,Unit] = finish(()); implicit def finish[R](result: R): MyClass[Any,R] = ... } 我正在收到编译器警告:
这个警告意味着什么? 解决方法
这里“参数化”应该是“类型参数化”.
或者在其他方面,警告说因为你已经定义了一个隐式转换,它同时被重载(有其他同名方法)和泛型,那么该方法实际上不能用作隐式视图,尽管它可以使用隐含地转换纯粹的价值. 我将尝试用一个例子来说明差异: class MyClass object MyClass { implicit def finish: MyClass = null implicit def finish[R](result: R): MyClass = null } val a: Int = 123 val b: MyClass = a // Compiles fine: implicit conversion properly applied def foo[R<%MyClass]( r: R ) {} foo( 123 ) // Error: No implicit view available from Int => Test.MyClass 在上面的代码片段中,(Int类型)被隐式转换为MyClass,因此隐式转换按预期工作. 然而,有趣的部分是foo方法.它被声明为绑定到MyClass的视图.换句话说,您应该能够将任何可隐式转换为MyClass的值传递给foo.但是这里无法编译.这是编译器警告您的此错误. 如果你想知道第一种情况(直接隐式转换)和第二种情况(带有视图绑定的方法调用)之间有什么不同,这将允许一个编译正常而不是另一个,关键点是视图绑定需要传递一个隐含的函数值. 确实, def foo[R<%MyClass]( r: R ) 是相同的 def foo[R]( r: R )( implicit conv: R => MyClass) 因此,在调用foo时,编译器不仅需要找到适当的隐式转换,还需要将隐式转换方法(第二次完成重载)提升为函数实例,并将其隐式传递给foo. 我相信这是促销,编译器(由于某种原因)在类型参数化和重载方法的情况下不知道如何做. 作为旁注,scala 2.10中没有发出警告(默认情况下)(它被认为太嘈杂,scala中类型类使用量激增),但真正的问题仍然存在,并且对foo的调用仍然无法编译. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |