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()
.
那样对它进行普通调用
我可能理解错了你的要求,但我想指出这些内容以防万一,因为你在谈论反射等等!
我正在尝试获取某些 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()
.
我可能理解错了你的要求,但我想指出这些内容以防万一,因为你在谈论反射等等!