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

Kotlin 为什么公共内联函数可以调用私有构造函数,kotlin,Kotlin,我的类有一个私有构造函数,并为某种“泛型构造函数”在伴生对象上实现了invoke 类测试私有构造函数(类名:String){ 伴星{ //如果我删除了内部文件,它就会失败 内部内联运算符fun invoke():Test{ return Test(T::class.java.name)//为什么我可以调用它呢?构造函数是私有的 } } } 我甚至可以有一个公共内联函数来调用这个泛型构造函数 class Test private constructor(className: String) {

我的类有一个私有构造函数,并为某种“泛型构造函数”在伴生对象上实现了invoke

类测试私有构造函数(类名: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更改和调用模块未重新编译时可能引入的二进制不兼容问题(请参阅)。只有公共API
inline
函数才禁止此类调用

  • 为什么公共内联函数可以调用内部函数
这是一只虫子。通常,公共
内联
函数无法访问非公共API。对于
invoke()
运算符调用,似乎未检查此规则。我已提交问题:

  • 为什么我最终可以在一个公共内联函数中公开一个私有构造函数

这是由于第一点中的预期行为和第二点中的bug的组合。归根结底,这也是一个bug。

这不适用于内联函数,但我认为这是JVM的限制,而不是设计选择,因为普通函数确实有这样的访问权限。我的观点是,这种访问能力更符合预期,而不是一个问题。