我創建了type MyString = String
。如何強制Scala不使用類型別名的來源?
現在我想讓我的函數只接受我的MyString
而不是String
,後者根本不應該編譯。
def myFunc(s: MyString) = println(s)
同時接受String
和MyString
ARGS:
scala> type MyString = String
defined type alias MyString
scala> def myFunc(s: MyString) = println(s)
myFunc: (s: MyString)Unit
scala> val s1: MyString = "aaa"
s1: MyString = aaa
scala> myFunc(s1)
aaa
scala> val s2: String = "aaa"
s2: String = aaa
scala> myFunc(s2)
aaa
scala> trait MyString extends String
<console>:10: error: illegal inheritance from final class String
trait MyString extends String
^
scala> s1
res7: MyString = aaa
scala> s2
res8: String = aaa
scala> s1 == s2
res9: Boolean = true
這不完全是我想要的。這樣的包裝是某種柺杖。我希望'MyString'是一個帶有一些額外限制的字符串(比如只有10個字符),而你的建議不允許在'String'之外的函數中使用'MyString'。這就是爲什麼我加上'extend'的原因,如果String不是final的,它會起作用。 – user2317480
@ user2317480是的,這與您的意圖相匹配的程度有限。但是,如果需要在任何需要'String'參數的地方接受'MyString',可以添加一個從'MyString'到'String'的隱式轉換,例如:'implicit def mine2str(myStr:MyString):String = myStr .value'。 – Shadowlands
你的方法的主要缺點是我(作爲開發人員)必須記住字符串應該有10個字符。我想讓編譯器爲我記住它。斷言也不是解決方案,因爲它是運行時。可能需要一些類型級別的魔法a-la。似乎我應該編輯我的問題。 – user2317480