我正在嘗試獲取某些類屬性的型別,以便強輸入我的 Kotlin 代碼。在打字稿中,我們可以這樣做(愚蠢的例子,但這是為了解釋)
class Test {
private _prop:string
constructor(val:Test["_prop"]){
this._prop = val
}
public get prop():Test["_prop"] { return this._prop}
}
const t:Test["_prop"] = "fdds"
這樣做的好處是,如果我需要更改“_prop”的型別,則無需重構整個代碼,因為型別是 find 感謝Test["_prop"]. 有沒有辦法在 Kotlin 中做到這一點?
我在 Kotlin 中見過反射函式,但無法得到我想要的
科特林代碼:
class Test(val prop:Int) {
fun ppr() {
println(prop)
}
fun getProp():Int {
return prop
}
}
fun main() {
println("Hello, world!!!")
var t:Test = Test(4)
t.ppr()
var a:Int = t.getProp() // how to change :Int by "return type of func Test.prop
}
uj5u.com熱心網友回復:
你想要做的是強型別的反面。強型別系統的重點在于您準確定義事物是什么,并且系統要求您正確地與這些事物互動,并阻止您做那些型別不支持的事情
您正在使用特定型別和定義的型別層次結構,并且強制執行與它們互動的方式。有可能超出型別系統,例如使用未經檢查的強制轉換,或通過反射(這可能接近于完全拋棄整個事物) - 但這失去了強型別的好處,它可以提供的保證和幫助,并使錯誤的可能性更大
基本上如果你想改變型別,你應該重構它。這讓系統可以系統地為您處理這一切,它會指出更改可能引入的任何問題,以便您解決和處理它們。這是強型別系統的另一個好處——它可以通過這種方式幫助你
如果您想留在型別系統中,但只想更新型別并避免在一堆檔案中創建更改,那么@Sweeper 的typealias方法將起作用 - 有點將型別定義抽象到一個地方(您可以給它一個更有意義的名稱,但不能反映它現在恰好是的特定型別)。但是,如果您有意義地更改該底層型別是什么,那么您的代碼可能無論如何都必須處理它,除非您只是對它進行普通呼叫,例如toString().
我可能得到了你所要求的錯誤,但我想指出這些東西以防萬一,因為你在談論反射等等!
uj5u.com熱心網友回復:
你不能完全像在 Kotlin 中那樣做,但你可以宣告一個型別別名,它可以達到相同的結果 - 使你可以通過只編輯一個地方來更改多個事物的型別。
typealias PropType = Int
class Test(val prop: PropType) {
fun prop(): PropType {
return prop
}
}
要更改兩者的型別,只需更改typealias PropType = Int行。
但是,請注意,如果您只想撰寫一個 getter,您實際上并不需要這樣做。如果它所做的只是回傳屬性的值,則不需要顯式撰寫 getter。如果你想在 getter 中做一些額外的事情,你可以這樣做:
class Test(prop: Int) {
val prop = prop
get() {
// do something extra in the getter
println("getting prop!")
return field // return the underlying field
}
}
每當您訪問時都會呼叫 getter Test.prop,而且您只需更改一個位置即可更改屬性的型別。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/440825.html
上一篇:嘗試在Python上創建僅包含列名的df時,為什么會出現TypeError:pandas._libs.missing.isnaobj()?Pandas1.4.0相關
