我有一个私有构造函数用于我的类,并在伴随对象上实现了对某种“泛型构造函数”的调用
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
这不应该意味着每个invokation test()都扩展为Test(Any :: class.java.name),即使该构造函数是私有的吗?
所以我的问题是:
>为什么内部内联函数可以调用私有构造函数? (公共乐趣不能)
>为什么公共内联乐趣可以调用内部函数?
>为什么我最终可以在公共内联乐趣中公开私有构造函数?
最佳答案
- Why can that internal inline fun call a private constructor? (a public fun couldn’t)
内部内联函数可以访问非公共API,因为它只能在同一个模块中调用,因此它不会受到API更改时可能引入的二进制不兼容性的影响,并且不会重新编译调用模块(见docs).此类调用仅对公共API内联函数禁止.
- Why can that public inline fun call an internal function?
这是一个错误.通常,公共内联函数无法访问非公共API.似乎没有检查invoke()操作符调用的规则.我已经提交了这个问题:KT-20223.
- And why can I ultimately expose a private constructor in a public inline fun?
这是由于第一点中预期行为的组成和第二点中的错误.最终,它也是一个错误.