Kotlin 通用属性

Jef*_*res 8 kotlin

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

    }
}
Run Code Online (Sandbox Code Playgroud)

zsm*_*b13 5

由于关于泛型文档没有提到这样的事情,我很确定这不是语言的一部分。

这很可能是因为您必须在某个时候声明属性的类型。泛型函数是有意义的,因为您使用具有某种静态类型的参数调用它们(或者在扩展函数的情况下,此类参数调用它们)。

问题是,您为什么要拥有这样的通用属性?

当您尝试设置该属性时,您希望它接受什么值?如果答案是什么,也许它的类型应该是Anyor Any?

这同样适用于读取它 - 您希望从该属性读取的值具有什么类型?如果您根本不想指定类型,同样,它可能应该是Anyor Any?

实际上在语言中的解决方案,即让类/接口采用类型参数,解决了这些问题。


Rud*_*olf 5

我是 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()
    }
}
Run Code Online (Sandbox Code Playgroud)

由于属性的 getter 和 setter 也是一个函数,如果我能够将 T 指定为泛型类型,那就太好了。我尝试使用 getValue 和 setValue 作为通用函数,这似乎有效,但没有使用 Kotlin 属性习惯用法。


Chr*_*ann 4

不,编译器怎么知道T是什么?如果您无论如何都不需要泛型类型参数T,则可以将其声明为val t: Any.