比方說,我有一個函數:我們能否爲我們無法控制的類型聯合實現編譯時類型安全性?
fun doSomething(vararg pairs: Pair<String, *>) {
// Do things with the pairs
}
這種方法的問題是,它允許任何類型的Pair
(例如,Pair<String, CustomType1>
)下半場。
如果我只想允許有限數量的類型,我該如何實現?
如果函數有一個簡單的簽名,我可以實現通過超載的限制,像這樣:
fun doSomethingSimpler(param: Boolean) {
// Boolean implementation
}
fun doSomethingSimpler(param: Int) {
// Int implementation
}
// etc.
如果受限鍵入「set」是在我的控制,我可以使用密封接口或類來實現這一點。例如。
sealed class Root
class Child1 : Root()
class Child2 : Root()
fun doSomethingICanControl(param: Root) {
// Root implementation
}
然而,如果我沒有在控制類型或者他們是原始的,如何防止*
從通過允許一切嗎?
我知道我可以使用智能鑄件獲得運行時的安全性,但這種在編譯的時候做什麼?
或者該語言不允許嗎?
編輯1
我知道我可以創建自己的盒子類型(例如MyBoolean
),並使用一個通用的接口或密封類,但是這將是樣板,每個人都將不得不每次他們需要時間寫。
編輯2
要清楚,我希望能夠做出像這樣的調用:
doSomething(
"key1" to false,
"key2" to "value2",
"key3" to 86
)
...即擁有一套混合的「第二」(中Pair
)類型。
標記界面是實現這一點的唯一方法。對於您無權訪問的類(例如int),您可以自行將其放入。 – Joshua
自編輯2使我的答案無效。 –
你能再詳細一點嗎? * doSomething *你打電話給圖書館的方法嗎?或者一個庫調用你的* doSomething *? – D3xter