Kotlin 为什么公共内联函数可以调用私有构造函数
我的类有一个私有构造函数,并为某种“泛型构造函数”在伴生对象上实现了invokeKotlin 为什么公共内联函数可以调用私有构造函数,kotlin,Kotlin,我的类有一个私有构造函数,并为某种“泛型构造函数”在伴生对象上实现了invoke 类测试私有构造函数(类名:String){ 伴星{ //如果我删除了内部文件,它就会失败 内部内联运算符fun invoke():Test{ return Test(T::class.java.name)//为什么我可以调用它呢?构造函数是私有的 } } } 我甚至可以有一个公共内联函数来调用这个泛型构造函数 class Test private constructor(className: String) {
类测试私有构造函数(类名:String){
伴星{
//如果我删除了内部文件,它就会失败
内部内联运算符fun invoke():Test{
return Test(T::class.java.name)//为什么我可以调用它呢?构造函数是私有的
}
}
}
我甚至可以有一个公共内联函数来调用这个泛型构造函数
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
public inline fun test()=test()//为什么我可以调用它,它是内部的
这是否意味着每次调用test()
都会扩展到test(Any::class.java.name)
,即使该构造函数是私有的
因此,我的问题是:
- 为什么
可以调用私有构造函数?(一场公众娱乐不能)internalinlinefun
- 为什么那
可以调用一个内部函数public-inline-fun
- 为什么我最终可以在
公共内联函数中公开私有构造函数
- 为什么内部内联函数可以调用私有构造函数?(一场公众娱乐不能)
内部
内联
函数可以访问非公共API,因为它只能在同一个模块中调用,因此不会出现API更改和调用模块未重新编译时可能引入的二进制不兼容问题(请参阅)。只有公共APIinline
函数才禁止此类调用
- 为什么公共内联函数可以调用内部函数
内联函数无法访问非公共API。对于invoke()
运算符调用,似乎未检查此规则。我已提交问题:
- 为什么我最终可以在一个公共内联函数中公开一个私有构造函数
这是由于第一点中的预期行为和第二点中的bug的组合。归根结底,这也是一个bug。这不适用于内联函数,但我认为这是JVM的限制,而不是设计选择,因为普通函数确实有这样的访问权限。我的观点是,这种访问能力更符合预期,而不是一个问题。