为什么公共内联函数可以调用私有构造函数?

我有我的类的私人构造函数,并实施援助对象的某种“通用构造函数”

class Test private constructor(className: String) { companion object { // If I remove the internal it fails internal inline operator fun <reified T> invoke(): Test { return Test(T::class.java.name) // why can I even call it? The constructor is private } } } 

我甚至可以有一个公共的内联函数调用通用的构造函数

 public inline fun test() = Test<Any>() // Why can I call it, it is internal 

这不应该意味着即使构造函数是私有的,每个调用test()扩展到Test(Any::class.java.name)

所以我的问题是:

  • 为什么internal inline fun可以调用私有构造函数? (公共乐趣不能)
  • 为什么public inline fun函数可以调用内部函数?
  • 为什么我最终会公开一个私有构造函数在public inline fun

  • 为什么内联可以调用私有构造函数? (公共乐趣不能)

一个internal inline函数可以访问非公开的API,因为它只能在同一个模块中调用,所以它不会遭受二进制不兼容的影响,这些二进制不兼容性可能在API更改和调用模块不被重新编译时引入(看文档 )。 这种调用只能用于公共API inline函数。

  • 为什么公共内联函数可以调用内部函数?

这是一个错误。 通常,公共inline函数不能访问非公共API。 这个规则似乎没有被检查invoke()运算符调用。 我提交了问题: KT-20223 。

  • 为什么我最终会公开一个私有构造函数在公共内联的乐趣?

这是由于第一点中的预期行为的组成和第二点中的错误。 最终,这也是一个错误。

伴随对象在类中。 所以类内的代码提供了一个调用私有方法的接口,但记住这个代码是类内的代码。

正如公共类方法可以访问私有变量并将其值返回到外部一样,这些方法可以做到这一点,因为它们是类的一部分。 在这种情况下,同样的原则也是适用的,所以我建议这种从班级内部访问私人成员的能力是可以预料的,而不那么期望的行为就是一个班级正规内联功能的行为。 我相信在这方面正规内联函数的行为是一个实现的限制,从伴侣对象不是必要的。