5
我是用無形的標籤,寫類似的代碼這一點 -斯卡拉類型和編譯
import shapeless.tag
import [email protected]@
object Typeplay {
trait StringTrait
type MyString = String @@ StringTrait
case class StringClass(mps: MyString)
val stringClass = StringClass(tag[StringTrait]("test"))
}
而這個代碼將無法編譯。斯卡拉編譯器抱怨最後一行代碼說 -
[error] found : String("test")
[error] required: shapeless.tag.Tagged[in.bharathwrites.Typeplay.StringTrait] with String
[error] val stringClass = StringClass(tag[StringTrait]("test"))
我不明白我在做什麼錯了。所以我做了一個小的變化,以我的代碼 -
import shapeless.tag
import [email protected]@
object Typeplay {
trait StringTrait
type MyString = String @@ StringTrait
case class StringClass(mps: MyString)
val stringTag = tag[StringTrait]("test")
val stringClass = StringClass(stringTag)
}
這基本上只是使用顯式變量的標記。此代碼編譯!
這怎麼可能?爲什麼第一個程序不能編譯,第二個程序呢?
能否請您提供一些線索瞭解這個限制是什麼。另外,我們對於如何將一個值轉換爲多於一種類型感到困惑,正如您在第一個建議中所做的那樣。它的工作原理,但我不明白如何。我嘗試了一個小程序,看看它是否適用於所有場景,並且它不是 - – Bharadwaj
scala> def myToString [A](s:A)= s.toString myToString:[A](s:A)字符串 scala > myToString [String] [Object](「hello」):13:error:method myToString:(s:String)String不接受類型參數。 myToString [String] [Object](「hello」) ^ scala> myToString [String](「hello」) res1:String = hello' –
Bharadwaj
@Bharadwaj,請參閱更新。 – Aivean