Scala 什么是;参数化重载隐式方法作为视图边界不可见;编译器警告是什么意思?

Scala 什么是;参数化重载隐式方法作为视图边界不可见;编译器警告是什么意思?,scala,compiler-warnings,implicit-conversion,Scala,Compiler Warnings,Implicit Conversion,我将两个实用方法声明为implicit class MyClass { ... } object MyClass { implicit def finish: MyClass[Any,Nothing,Unit] = finish(()); implicit def finish[R](result: R): MyClass[Any,Nothing,R] = ... } 我收到了编译器警告: 参数化重载隐式方法作为视图边界不可见 这个警告是什么意思?这里的“参数化”实际上应该是“类型

我将两个实用方法声明为
implicit

class MyClass { ... }
object MyClass {
   implicit def finish: MyClass[Any,Nothing,Unit] = finish(());
   implicit def finish[R](result: R): MyClass[Any,Nothing,R] = ...
}
我收到了编译器警告:

参数化重载隐式方法作为视图边界不可见

这个警告是什么意思?

这里的“参数化”实际上应该是“类型参数化”。 或者在其他WOD中,警告说,由于您定义了一个隐式转换,它既是重载的(还有其他同名方法)又是泛型的,因此该方法实际上不能用作隐式视图,尽管它可以用于隐式转换一个值。 我将试着用一个例子来说明区别:

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

def foo[R]( r: R )( implicit conv: R => MyClass)
因此,在调用
foo
时,编译器不仅需要找到合适的隐式转换,还需要将隐式转换方法(第二个
finish
重载)升级到函数实例,并隐式地将其传递给
foo

我相信这是编译器(出于某种原因)在类型参数化和重载方法的情况下不知道如何做的提升。 这纯粹是猜测,但我很确定这只是一个实现限制:这在很大程度上是可行的,但它会带来足够多的实现问题,以至于它被认为不够重要(毕竟,您可以通过重命名隐式转换方法来修复它)


顺便说一句,scala 2.10中没有发出警告(默认情况下)(它被认为太吵了,scala中类型类的使用激增),但真正的问题仍然存在,对
foo
的调用仍然无法编译。

请发布一个代码nsippet来重现问题,并指定您的scala版本。不管怎样,您的代码片段确实会产生警告,但仅在scala 2.9.x中出现(在scala 2.10中不再出现)。
def foo[R]( r: R )( implicit conv: R => MyClass)