Kotlin 科特林。如何在开放类中实现内部接口?

Kotlin 科特林。如何在开放类中实现内部接口?,kotlin,Kotlin,我想要一个开放类来实现内部接口,并且只在包中使用这个接口。如果我将这个内部接口设置为非内部接口,它要求我将这个接口中使用的所有类设置为非内部接口,然后它会创建一个多米诺更改,所以我需要将所有内容设置为非内部接口 比如: open class Form : Interface { override fun a(): ActionExecutor {} } internal interface Interface { fun a(): ActionExecutor } 当我试图编译它时,

我想要一个开放类来实现内部接口,并且只在包中使用这个接口。如果我将这个内部接口设置为非内部接口,它要求我将这个接口中使用的所有类设置为非内部接口,然后它会创建一个多米诺更改,所以我需要将所有内容设置为非内部接口

比如:

open class Form : Interface {
  override fun a(): ActionExecutor {}
}

internal interface Interface {
  fun a(): ActionExecutor
}
当我试图编译它时,我得到以下错误
Form.kt:(74,16):“public”函数在使用修饰符标记接口时公开其“内部”返回类型ActionExecutor

当此接口中的任何客户端看到声明类时,都会看到其内部成员。如果要在另一个模块中使用具有
内部
修饰符的实体,则必须删除此修饰符。这可能导致链删除,因为该实体可能使用其他
内部
实体

当您使用
public
类实现
internal
接口时,您将公开其
internal
成员,这是禁止的

当我试图编译它时,我得到以下错误Form.kt:“public”函数公开其“internal”返回类型ActionExecutor

然后
fun a():ActionExecutor
已经不能在
表单中公开,无论实现
接口
。因为如果是的话,模块外的用户可以调用它并获得一个
ActionExecutor
,而他们不应该这样做

一个选项不是直接在
表单上实现接口,而是使方法/属性返回它:

open class Form {
    // some methods
    internal val asInterface: Interface = object : Interface {
        override fun a(): ActionExecutor {
            // can access members of Form here
        }
    }
}

然后,同一模块中的代码可以自由地将
表单
视为
接口
,而外部代码不能,因此没有问题。

在尝试实现内部接口时是否有错误?是的,添加到derscriptionIt的bcz
ActionExecutor
类是内部的。你能让它不是内部的吗?