当前位置: 首页 > 知识库问答 >
问题:

kotlin获取类属性的静态类型

叶茂才
2023-03-14

我正在尝试获取一些类属性的类型,以便强烈键入我的静态编程语言代码。在打字稿中,我们可以这样做(愚蠢的例子,但这是为了解释)

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”的类型,不需要重构整个代码,因为类型是通过< code>Test["_prop"]找到的。在科特林有办法做到这一点吗?

我在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

}

共有2个答案

吴飞语
2023-03-14

在Kotlin中你不能完全像那样做,但是你可以声明一个类型别名,这在某种程度上实现了相同的结果——使你能够通过只编辑一个地方来改变多个事物的类型。

typealias PropType = Int

class Test(val prop: PropType) {
    fun prop(): PropType {
        return prop
    }
}

要更改两者的类型,只需更改< code > type alias prop type = 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,同样,您只需要更改一个位置即可更改属性的类型。

韩鸿
2023-03-14

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

您正在处理特定的类型和已定义的类型层次结构,并且您可以与它们交互的方式是强有力的。有可能超越类型系统,例如,通过未检查的强制转换,或者通过反射(这可能接近于完全抛弃所有的东西)——但是这就失去了强类型的好处,失去了它所能提供的保证和帮助,并且更有可能出错

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

如果您想留在类型系统中,但只想更新一个类型并避免在一堆文件中创建更改,那么@Sweeper的< code>typealias方法将会起作用——将类型定义抽象到一个地方(您可以给它一个更有意义的名称,该名称不反映它现在的具体类型)。但是,如果您有意更改了底层类型,您的代码可能无论如何都要处理它,除非您只是对它进行一个普通的调用,如< code>toString()。

我可能弄错了你要求的东西,但我想指出这些东西以防万一,因为你说的是反思和所有!

 类似资料:
  • 是否有可能在Kotlin 属性初始化之前从其获取< code>::class.java? 从逻辑上讲,它应该可以工作——我试图获取一个类而不是一个值,但实际上它在未初始化的属性访问异常时失败。 请注意,我试图获取类的属性位于泛型类中,其类型是泛型参数之一: 我需要这个类来创建的实例 当然,我不能做到: 对此有什么解决办法吗?

  • 问题内容: 我有这个: 一个字符串变量,其中包含类名() 一个具有属性名称()的字符串变量 我想从该类中获取该属性,问题是该属性是静态的,我不知道该怎么做。 如果该属性不是静态的,则可能是: 如果属性是一个方法,我本可以使用call_user_function 但就我而言,我只是迷路了。但是,我希望这是可能的。有了PHP所具有的数千个功能,他最好为此也有所准备。也许我缺少什么? 谢谢! 编辑: 对

  • 问题内容: 如果存在Kotlin语言,可以用什么替代方法?如果没有,当我需要在Kotlin中使用时如何解决此问题?请参见下面的代码示例: 我搜索了很多东西,没有发现任何东西,非常感谢。 问题答案: 只需在Kotlin中省略。 内部类(持有对外部对象的引用) Java: 科特林: 静态内部类又称为嵌套类(不引用外部对象) Java: 科特林:

  • 本文向大家介绍PowerShell中调用.NET对象的静态方法、静态属性和类方法、类属性例子,包括了PowerShell中调用.NET对象的静态方法、静态属性和类方法、类属性例子的使用技巧和注意事项,需要的朋友参考一下 本文介绍在PowerShell中如何使用.NET对象,PowerShell内在支持大量的.NET对象。 调用类的静态方法 用中括号把类的名称括起来,然后输入两个冒号,然后再输入方法

  • 我有一个实用工具类,其中我有一个方法,它需要用户名和密码来连接其他URL。我需要将用户名保存在属性文件中,这样我就可以随时更改它。但当我在静态方法中使用它(作为实用程序类)时,问题是它显示为空(即它不能从属性文件中读取)。 但当我在其他控制器中输入这些值时,它们就会到达那里。所以我的问题是如何读取静态字段中的属性值