Kotlin泛型属性

11
在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个回答

6

既然泛型文档中没有提到这种情况,我很确定这不是语言的一部分。

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

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

当你尝试设置它时,你希望这个属性接受什么类型的值?如果答案是任何类型,那么它的类型应该是AnyAny?

相同的规则适用于读取它-您期望从此属性中读取的值具有什么类型?如果您根本不想指定类型,则应该是AnyAny?

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


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()
    }
}

由于属性的getter和setter也是函数,如果我能将T指定为通用类型就更好了。我尝试使用getValue和setValue作为通用函数,这似乎可行,但不是使用Kotlin属性惯用语法。


4
不,编译器怎么知道 T 是什么?如果你不需要泛型类型参数 T,你可以将其声明为 val t: Any

1
也许他想在任何类型上插入约束,例如 <T: String> val t:T。 - Rafael Pereira Ramos

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接