为什么不允许从kotlin接口访问java接口中定义的常量,或者至少不能访问它。还有别的办法吗?
(是的,我知道常量接口模式很难使用有效Java书中的接口)
下面的代码(java)编译
// ==== JSubsystem.java ====
public interface JSubsystem {
String IRIS = "IRIS";
String TCS = "TCS";
// ...
}
// ==== JComponentType.java ====
public interface JComponentType {
String HCD = "HCD";
String Assembly = "Assembly";
// ...
}
interface Demo extends JSubsystem {
default void foo() {
System.out.println(IRIS);
}
}但是在以下扩展自java的kotlin接口中,无法访问IRIS\\TCS/TCS\HCD。
// ==== AllModels.kt ====
interface AllModels : JSubsystem, JComponentType {
fun foo() = println(IRIS)
}更多关于我们为什么在这种情况下结束的背景:
我们有一个大型的scala代码库,所有的模型都提供java和scala访问。
现在,我们已经为1-5%的用户提供了脚本需求,我们已经使用了kotlin的脚本(.kts)、dsl、coroutines和悬置功能。
我们提供了script结构,用户可以在其中访问完整的DSL和所有模型。
我们不希望用户显式地从不同的文件导入模型,也不希望在kotlin中重复定义模型。
我们认为在这种情况下可以使用的解决方案之一是在接口中拥有java模型(这些是对scala模型的简单委托),然后在kotlin端有一个接口,从所有这些java模型接口扩展而来,然后script可以是这个接口的receiver - AllModels。
发布于 2020-01-27 21:29:18
您可以像https://github.com/Kotlin/KEEP/blob/master/proposals/scripting-support.md中所描述的那样自定义脚本环境,特别是可以添加defaultImports将自动提供的导入。
在Kotlin论坛上的这个例子应该是有帮助的:
首先,您需要创建一个脚本定义--一个单独的jar来描述您的脚本“模板”,例如,您的定义可能类似于https://github.com/JetBrains/kotlin/tree/master/libraries/tools/kotlin-main-kts: @KotlinScript(fileExtension = "custom.ext",compilationConfiguration = ScriptConfiguration:: class )抽象类MyScript(val绑定: Map) { val ortResult =绑定“OrtResult”作为OrtResult val evalErrors = mutableListOf()对象ScriptConfiguration : ScriptCompilationConfiguration( { defaultImports("com.here.ort.model.*","java.util.*") ide {custom.ext} }) 为您的脚本设置一个专用的扩展(上面示例中的“custom.ext”)是个好主意,因为IDE通过扩展来区分脚本。 然后,您需要创建自己的JSR-223工厂,方式与这里的- https://github.com/JetBrains/kotlin/blob/master/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/jsr223/KotlinJsr223ScriptEngineFactoryExamples.kt#L28相同,但是使用脚本定义(MyScript)代替KotlinStandardJsr223ScriptTemplate。你可能可以在同一个罐子里做。当然,您需要在“服务”文件夹中注册它。 不过,您仍然需要在评估器中添加一个part部分,但它似乎与IDE无关。 最后,您需要为Intellij提供定义。最简单的临时方法是指定定义类的FQN以及在Intellij中的kotlin编译器设置中加载它所需的类路径->“Kotlin脚本”。
发布于 2020-01-27 11:29:26
您需要显式地指定接口:
fun foo() = println(JSubsystem.IRIS)
或者可以显式导入常量:
import your.package.name.JSubsystem.IRIS
https://stackoverflow.com/questions/59929763
复制相似问题