为什么公共内联函数可以调用私有构造函数?
我有我的类的私人构造函数,并实施援助对象的某种“通用构造函数”
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 。
- 为什么我最终会公开一个私有构造函数在公共内联的乐趣?
这是由于第一点中的预期行为的组成和第二点中的错误。 最终,这也是一个错误。
伴随对象在类中。 所以类内的代码提供了一个调用私有方法的接口,但记住这个代码是类内的代码。
正如公共类方法可以访问私有变量并将其值返回到外部一样,这些方法可以做到这一点,因为它们是类的一部分。 在这种情况下,同样的原则也是适用的,所以我建议这种从班级内部访问私人成员的能力是可以预料的,而不那么期望的行为就是一个班级正规内联功能的行为。 我相信在这方面正规内联函数的行为是一个实现的限制,从伴侣对象不是必要的。