在 Kotlin 中获取参数化类型的参数

问题描述

所以我有一个具有泛型类型的类

class Genericclass<T> {
// At some point in the class I have variable item of type T
val name: String = item.name
}

我确信 Genericclass 的类型 T 将与具有“名称属性的类一起使用。但当然,我得到了一个“未解析的参考名称”。 Android Studio 通过“创建扩展属性 T.name”为我生成了这段代码

private val <T> T.name: String
    get() {}

我真的不知道在 get 之后在括号 {} 中放什么。我尝试了 return name,但出现递归属性错误

有什么想法吗?

谢谢

解决方法

如果你知道每个类型 T 都有属性 name 你可以隐式声明它:

// GenericClass.kt
class GenericClass<T : HasName> {
    // At some point in the class I have variable item of type T
    val name: String = item.name
}

// HasName.kt
// Create new interface with "name" property
interface HasName {
    val name: String
}

但您还必须为所有可用作 T 的类实现这个新接口。

,

我确信 GenericClass 的类型 T 将与具有“name”属性的类一起使用。

然后您需要明确声明。默认情况下,T 扩展 Any?。您需要通过声明一些接口来缩小 T 的可能类型,例如

interface Named {
    val name : String
}

并将 T : Named 作为通用参数传递。您还需要创建所有类,您将作为通用参数传递,以实现该接口。顺便说一句,GenericClass<T : Named> 类本身可以声明为实现该接口:

class GenericClass<T : Named> : Named {
    override val name: String = item.name
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...