kotlin 获取 class 属性 的静态类型

kotlin get static type of a class property

我正在尝试获取某些 class 属性的类型,以便强键入我的 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”的类型,则无需重构整个代码,因为 Test["_prop"] 找到了类型。 有没有办法在 Kotlin 中做到这一点?

我看过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

}

你不能像在 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
        }
}

每次访问Test.prop都会调用getter,同样,只需更改一处即可更改属性的类型。

你想做的是强类型的反面。 strong-typed 系统的要点是你要准确定义事物是什么,系统要求你正确地与这些事物交互,并阻止你做那些类型不支持的事情

您正在使用特定的 类型 并定义了 类型层次结构 ,并且您可以与它们交互的方式得到了严格执行。可以跳出类型系统,例如使用未经检查的强制转换,或通过反射(这可能接近于完全抛弃整个东西)——但这正在失去强类型的好处,它可以提供的保证和帮助,并且更容易出错

基本上如果你想改变类型,你应该重构它。这让系统系统地为您处理所有事情,它会指出更改可能引入的任何问题,以便您解决和处理它们。这是强类型系统的另一个好处 - 它可以这样帮助你


如果您想留在类型系统中,但只想更新类型并避免在一堆文件中创建更改,那么@Sweeper 的 typealias 方法将起作用 - 有点抽象类型定义到一个地方(你可以给它一个更有意义的名字,而不是反映它现在恰好是的特定类型)。但是如果你有意义地改变底层类型是什么,你的代码可能无论如何都必须处理它,除非你只是像 toString().

那样对它进行普通调用

我可能理解错了你的要求,但我想指出这些内容以防万一,因为你在谈论反射等等!