【问题标题】:Kotlin Generic PropertyKotlin 通用属性
【发布时间】:2017-05-20 19:27:28
【问题描述】:

在 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

    }
}

【问题讨论】:

    标签: kotlin


    【解决方案1】:

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

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

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

    当您尝试设置此属性时,您希望该属性接受什么值?如果答案是什么,那么它的类型可能应该是AnyAny?

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

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

    【讨论】:

      【解决方案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】:

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

        【讨论】:

          【解决方案4】:
              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)}")
              }
          

          【讨论】:

            猜你喜欢
            • 2018-04-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-10-04
            • 1970-01-01
            • 2019-04-02
            相关资源
            最近更新 更多