问题描述
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
}