gpt4 book ai didi

scala - "parameterized overloaded implicit methods are not visible as view bounds"编译器警告是什么意思?

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

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

class MyClass { ... }
object MyClass {
implicit def finish: MyClass[Any,Nothing,Unit] = finish(());
implicit def finish[R](result: R): MyClass[Any,Nothing,R] = ...
}

我收到编译器警告:

parameterized overloaded implicit methods are not visible as view bounds



这个警告是什么意思?

最佳答案

这里的“参数化”实际上应该是“类型参数化”。
或者换句话说,警告说因为您定义了一个隐式转换,它既是 重载 (还有其他同名方法)和通用 ,则该方法实际上不能用作隐式 View ,尽管它可以用于隐式转换纯值。
我将尝试用一个例子来说明差异:

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

在上面的代码片段中, a (类型为 Int )隐式转换为 MyClass ,所以隐式转换按预期工作。

然而,有趣的部分是 foo方法。声明它的 View 绑定(bind)到 MyClass .换句话说,您应该能够传递给 foo任何可隐式转换为 MyClass 的值.但是在这里它无法编译。这是编译器警告您的这个错误。
果然,如果你注释掉 finish 的第一个重载(不带类型参数的版本),或重命名版本以使其不重载(假设您将其中一个重命名为 finish2 ),然后编译错误就会消失。

如果您想知道第一种情况(直接隐式转换)和第二种情况(调用具有 View 绑定(bind)的方法)之间有什么不同,这将允许一个编译良好但不能编译另一个,关键是 View 绑定(bind)需要传递一个隐式函数值。

确实,
def foo[R<%MyClass]( r: R )

是相同的
def foo[R]( r: R )( implicit conv: R => MyClass)

所以打电话时 foo ,编译器不仅要找到合适的隐式转换,还要将隐式转换方法(第二个 finish重载)提升为函数实例,隐式传递给 foo .

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

附带说明一下,在 scala 2.10 中(默认情况下)不会发出警告(它被认为太嘈杂,随着 scala 中类型类使用的激增),但真正的问题仍然存在,并且调用 foo仍然无法编译。

关于scala - "parameterized overloaded implicit methods are not visible as view bounds"编译器警告是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15197349/

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