通用扩展属性接收器类型不匹配

时间:2016-11-25 16:04:24

标签: android kotlin

以下代码:

package com.gitlab.morality.navigable.support

import android.support.v4.app.Fragment
import android.support.v4.app.FragmentActivity
import kotlin.reflect.primaryConstructor

interface Navigable

val <FragmentType> FragmentType.parameters : MutableMap<String, in Any>
    where FragmentType : Fragment,
          FragmentType : Navigable
    by lazy { mutableMapOf<String, Any>() }

inline fun <reified FragmentType>
    FragmentType.navigate(containerViewId : Int, vararg parameters : Pair<String, Any>)
    where FragmentType : Fragment,
          FragmentType : Navigable {
    val fragment = FragmentType::class.primaryConstructor!!.call()
    parameters.forEach { fragment.parameters[it.first] = it.second }
    activity.supportFragmentManager.beginTransaction()
            .replace(containerViewId, fragment)
            .commit()
}

使用Kotlin 1.0.5导致以下编译器错误:

  

错误:(34,9)Public-API内联函数无法访问非公共API   'internal open fun():[错误:]在根包'

中定义      

错误:(34,18)未解决的参考。以下候选人均不得   因接收器类型不匹配而适用:public val    FragmentType#1(类型参数)   com.gitlab.morality.navigable.support.navigate).parameters:   MutableMap,其中FragmentType:Navigable定义于   com.gitlab.morality.navigable.support

我不明白我在这里做错了什么。这些错误消息意味着什么?

我可以解决这个问题,而不是让parameters属性成为Navigable的成员,但是然后需要一个实现者来实现该属性,这会剥夺这种技术的吸引力。除了被标记为Navigable以使用Navigable功能之外,实现类不需要执行任何特殊操作。

1 个答案:

答案 0 :(得分:3)

目前不支持具有多种接收器类型的扩展属性。您可以投票KT-10468以便在问题得到解决时得到通知。