如何使接口的具体实现无法在库范围之外访问。?

How to make concrete implementation of an interface not accessible outside the scope of the library.?

我正在开发一个 Android 库。我想让实施我的库的用户无法访问一些 classes。主要是接口实现classes。例如,我在模块 A 中有以下 classes,

由于我使用的是 Kotlin,所以我将 Dog 设为内部 class 以使其在库范围之外无法访问。但是,问题是 AnimalProvider 是一个具有名为 getAnimalSource() 的 public 函数的对象。像这样,

object AnimalProvider {
 fun getAnimalSource(
 context: Context, 
 lifecycleOwner: LifecycleOwner
 ) = Dog( context = Context, lifecycleOwner = lifecycleOwner)

它会抛出一个错误,例如,

public function exposes its internal return type.

我需要这个函数从 activity/view 初始化 Animal 对象。我在正确的方向上处理这个问题吗?或者,当您发布 android 库时,隐藏具体 classes 的正确方法是什么?

您的代码的问题在于它隐式声明 getAnimalSource() 的 return 类型为 Dog,而 Doginternal

您需要通过显式声明 getAnimalSource() 的 return 类型来隐藏该类型:

object AnimalProvider {
 fun getAnimalSource(
 context: Context, 
 lifecycleOwner: LifecycleOwner
 ): Animal = Dog( context = Context, lifecycleOwner = lifecycleOwner)

现在,getAnimalSource() 被宣布为 return 和 Animal,而不是 Dog,您应该处于更好的状态。