在kotlin中有没有办法创建一个通用属性而不用声明一个类级泛型类型?看起来像这样:
interface Generic {
val t: T //I need this type only once, thats why I dont wanna pass in the class level
fun <E> gMethod(e: E) { //This works, so I'm wondering if there's something similiar to properties
}
}
答案 0 :(得分:4)
由于documentation about generics没有提到这样的事情,我很确定这不是语言的一部分。
这很可能是因为您必须在某些点声明属性的类型。通用函数是有意义的,因为您使用具有某种静态类型的参数调用它们(或者在扩展函数的情况下,在这样的参数上调用它们)。
问题是,为什么你想拥有这样的通用属性?
当您尝试设置此属性时,您希望此属性作为值接受什么?如果答案是任何答案,可能其类型应为Any
或Any?
。
同样适用于阅读它 - 你期望从这个属性读取的价值是什么类型?如果您根本不想指定类型,那么它应该是Any
或Any?
。
实际上在语言中的解决方案,即让类/接口采用类型参数,解决了这些问题。
答案 1 :(得分:3)
不,编译器应该如何知道T
是什么?如果您仍然不需要泛型类型参数T
,则可以将其声明为val t: Any
。
答案 2 :(得分:2)
我是Kotlin的新手,但是通用属性并不是真的错了,是吗?
这是一个展示。我确实理解这个解决方案并没有完全解决你的问题。
interface BaseProperty<T> {
var value: T
}
class IntProperty(var stringVal: String) : BaseProperty<Int?> {
override var value: Int?
get() = Integer.valueOf(stringVal)
set(v: Int?) {
stringVal = v.toString()
}
}
由于属性的getter和setter也是一个函数,如果我能够将T指定为泛型类型,那就太好了。我试图使用getValue和setValue作为通用函数,这似乎有效,但不使用Kotlin属性惯用法。
答案 3 :(得分:0)
private val <T> List<T>.mutable: MutableList<T>
get() = this.toMutableList()
@Test
fun demonstrate_genericProperty() {
val numbers = listOf(1, 2, 3, 4)
val mutableNumbers = numbers.mutable
println("numbers = ${numbers}")
println("mutableNumbers = ${mutableNumbers}")
println("(numbers === mutableNumbers) = ${(numbers === mutableNumbers)}")
}