簡體   English   中英

什么“參數化重載隱式方法不可見為視圖邊界”編譯器警告意味着什么?

[英]What does “parameterized overloaded implicit methods are not visible as view bounds” compiler warning mean?

我聲明了兩個實用方法是implicit

class MyClass { ... }
object MyClass {
   implicit def finish: MyClass[Any,Nothing,Unit] = finish(());
   implicit def finish[R](result: R): MyClass[Any,Nothing,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

在上面的代碼段中, a (類型的Int )的隱式轉換為MyClass ,因此隱式轉換按預期方式工作。

然而,有趣的部分是foo方法。 它被聲明為綁定到MyClass的視圖。 換句話說,您應該能夠將任何可隱式轉換為MyClass值傳遞給foo 但是這里無法編譯。 這是編譯器警告您的此錯誤。 當然,如果你注釋掉第一個finish重載(沒有采用類型參數的那個),或者重命名一個版本以便它們不重載(比如你將其中一個重命名為finish2 ),那么編譯錯誤消失了。

如果你想知道第一種情況(直接隱式轉換)和第二種情況(帶有視圖綁定的方法調用)之間有什么不同,這將允許一個編譯正常而不是另一個,關鍵點是視圖綁定需要傳遞一個隱含的函數值。

確實,

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

是相同的

def foo[R]( r: R )( implicit conv: R => MyClass)

因此,在調用foo ,編譯器不僅需要找到適當的隱式轉換,還需要將隱式轉換方法(第二次finish重載)提升為函數實例,並將其隱式傳遞給foo

我相信這是促銷,編譯器(由於某種原因)在類型參數化和重載方法的情況下不知道如何做。 這是純粹的推測,但我很確定這只是一個實現限制:這非常可行,但它會引入足夠的實現問題而不被認為是足夠重要的(畢竟你可以通過重命名隱式修復它轉換方法)。

作為旁注,scala 2.10中沒有發出警告(默認情況下)(它被認為太嘈雜,scala中類型類使用量激增),但真正的問題仍然存在,並且對foo的調用仍然無法編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM