如何在 Kotlin 中使用内部构造函数实例化类

beg*_*ner 0 time constructor internals game-engine kotlin

我有兴趣从kotlin 提供的包中实例化Duration类。Kotlin.time

到目前为止我的代码..

...

import kotlin.time

class MyGLRenderer : GLSurfaceView.Renderer {
      override fun onSurfaceCreated(unused: GL10, config: EGLConfig) {
           var tp0:Duration= Duration(10L)
           //cannot acces `<init>:` it is internal in `Duration`          }
      override fun onDrawFrame(unused: GL10) {}
      override fun onSurfaceChanged(unused: GL10, width: Int, height: Int) {}
}
Run Code Online (Sandbox Code Playgroud)

那么我该如何实现这个意图呢?

我也尝试过:

var tp0:Duration= Duration(Duration.)
//to find a getter or setter that can be used to pass the required `long` data type to
// the constructor but no function will return long data type
Run Code Online (Sandbox Code Playgroud)

Ten*_*r04 5

你不应该能够。当库设计者像这样对最终用户隐藏函数或构造函数时,这是有原因的。这样做可能有多种原因,例如防止滥用该类或使其灵活地适应未来的变化,而不会破坏现有的最终用户代码。

在 的情况下Duration,构造函数的参数是内部定义的格式,其中 Long 的最后一位对值的精度进行编码。他们将其保密,因为这是一个实施细节。未来可能会改变。使用这种格式的值并不容易,并且很难在文档中清楚地解释。

例如,您上面的代码几乎肯定是错误的。代表什么意思10L?当数字编码两条不同的信息时,您将持续时间表示为十进制数字,这很奇怪。在十进制形式下,该值完全没有意义。

仍然可以使用反射来调用构造函数,但这不是反射的明智用途。这样做很脆弱,因为库作者可能会更改构造函数在内部解释的方式,并且它会默默地破坏您的代码并创建新的错误。

如果您只想创建 10 毫秒的持续时间,请使用10L.milliseconds