Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
外部不可更改类上的Kotlin DSL范围控制(类似于@DslMarker)_Kotlin - Fatal编程技术网

外部不可更改类上的Kotlin DSL范围控制(类似于@DslMarker)

外部不可更改类上的Kotlin DSL范围控制(类似于@DslMarker),kotlin,Kotlin,我有很多外部类(在外部生成;不在我的控制之下),它们没有生成器,创建起来相当麻烦。但是,使用apply构建它们相当容易,例如: SomeOfTheObjects().apply { someProperty = SomeOtherComplexObject().apply { someOtherProperty = "..." } } 现在我喜欢它与接收器一起工作的方式,但我想防止在SomeOtherComplexObject中设置someProperty。如果这些类在我的控制

我有很多外部类(在外部生成;不在我的控制之下),它们没有生成器,创建起来相当麻烦。但是,使用
apply
构建它们相当容易,例如:

SomeOfTheObjects().apply {
  someProperty = SomeOtherComplexObject().apply {
    someOtherProperty = "..."
  }
}
现在我喜欢它与接收器一起工作的方式,但我想防止在
SomeOtherComplexObject
中设置
someProperty
。如果这些类在我的控制下,在该类上放置一个
@DslMarker
就足够了,但由于它们不是,我想到的唯一其他方法是使用
,而不重命名参数,例如:

SomeOfTheObjects().also {
  it.someProperty = SomeOtherComplexObject().also {
    it.someOtherProperty = "..."
    //it.someProperty will not work if SomeOtherComplexObject has no such property
  }
}
虽然它可以工作,但现在代码中有大量的
it.
,我想知道,是否有可能出现与
@DslMarker
类似的行为

我尝试了以下几种方法:

@DslMarker
annotation class DemoMarker

@DemoMarker
inline fun <T> T.build(@DemoMarker builder : T.() -> Unit) = this.apply(builder)
@DslMarker
注释类标记
@人口标记
inline fun T.build(@DemoMarker-builder:T.()->Unit)=此.apply(builder)

“混合”,因为我最后到处都放了注释,但这没有任何效果。如果我把它放在一门课上,它会像预期的那样工作。我是不是错过了什么,而事实上这是可能的?或者是否有人对此有适当的解决方法,除了使用

对于第三方类,您可以在接收器类型上使用DslMarker注释,如前所述


如前所述,对于第三方类,您可以在接收器类型上使用DslMarker注释


你能从第三方类继承吗?可能会用
@DslMaker
继承并标记您的类?这是可能的,但其中大约有4k个类。。。它们显然是从模式生成的。也许我可以从某处获得模式,然后从头开始生成源代码,并在生成时添加注释:-)但我认为这个问题仍然有效。。。我希望还有其他解决方法:-)您能从第三方类继承吗?可能会用
@DslMaker
继承并标记您的类?这是可能的,但其中大约有4k个类。。。它们显然是从模式生成的。也许我可以从某处获得模式,然后从头开始生成源代码,并在生成时添加注释:-)但我认为这个问题仍然有效。。。我希望还有其他解决方法:-)完美!现在我只需要先设置这样一个扩展函数(比如
apply
/
),但这比其他任何东西都简单:-)完美!现在,我只需要首先设置这样一个扩展函数(比如
apply
/
),但这比其他任何东西都简单:-)
@DslMarker
@Target(AnnotationTarget.CLASS, AnnotationTarget.TYPE)
annotation class TestDsl

fun build1(builder: (@TestDsl DslReceiver1).() -> Unit) {}