Kotlin Generic Property

时间:2017-05-20 19:27:28

标签: 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

    }
}

4 个答案:

答案 0 :(得分:4)

由于documentation about generics没有提到这样的事情,我很确定这不是语言的一部分。

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

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

当您尝试设置此属性时,您希望此属性作为值接受什么?如果答案是任何答案,可能其类型应为AnyAny?

同样适用于阅读它 - 你期望从这个属性读取的价值是什么类型?如果您根本不想指定类型,那么它应该是AnyAny?

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

答案 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)}")
    }