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

我有一个私有构造函数用于我的类,并在伴随对象上实现了对某种“泛型构造函数”的调用

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

这不应该意味着每个in​​vokation 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?

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

点赞