代码之家  ›  专栏  ›  技术社区  ›  HelloCW

为什么我不能在Kotlin中定义<t where t:CharSequence,t:Appendable>?

  •  1
  • HelloCW  · 技术社区  · 6 年前

    代码A定义泛型 fun ensureTrailingPeriod 有参数限制。

    1:我觉得代码A很难理解,也许代码B很好,对吧?

    2:还有,我觉得 ensureTrailingPeriod 返回 Unit 使用代码A,但代码C是错误的,我如何修复它?

    代码A

    fun <T> ensureTrailingPeriod(seq: T)
        where T : CharSequence, T : Appendable{
        if (!seq.endsWith('.')) {
            seq.append('.')
        }
    }
    

    代码B

    fun <T where T : CharSequence, T : Appendable> ensureTrailingPeriod1(seq: T)  {
        if (!seq.endsWith('.')) {
            seq.append('.')
        }
    }
    

    代码C

    fun <T> ensureTrailingPeriod(seq: T)
         where T : CharSequence, T : Appendable  :Unit{
           if (!seq.endsWith('.')) {
             seq.append('.')
         }
    }
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   zsmb13    6 年前
    1. 这就是语言的语法,必须用 where ,它们必须位于函数头的末尾,而不是单个约束的位置。

    2. 任何显式返回类型也在 哪里 限制条件:

      fun <T> ensureTrailingPeriod(seq: T): Unit where T : CharSequence, T : Appendable {
          if (!seq.endsWith('.')) {
              seq.append('.')
          }
      }
      

    作为参考,您可以在 Kotlin grammar 也:

    function (used by memberDeclaration, declaration, topLevelObject)
      : modifiers "fun"
          typeParameters?
          (type ".")?
          SimpleName
          typeParameters? valueParameters (":" type)?
          typeConstraints
          functionBody?
      ;
    

    这清楚地告诉您函数声明的不同部分的顺序。首先,有修饰符(可见性、中缀等),然后 fun 关键字,然后是类型参数,如果函数是扩展名,则是接收器类型,函数的名称、参数列表、可选返回类型,最后是函数主体之前的类型约束。