Почему доступ к константам, определенным в интерфейсе java, из интерфейса kotlin не разрешен или, по крайней мере, я не могу получить к нему доступ. Есть ли другой способ?
(Да, я знаю, постоянный шаблон интерфейса - это плохое использование интерфейсов из книги Effective 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);
}
}
Но в следующем kotlin интерфейсе, который расширяется от java, IRIS | TCS | HCD недоступен
// ==== AllModels.kt ====
interface AllModels : JSubsystem, JComponentType {
fun foo() = println(IRIS)
}
Подробнее о том, почему мы оказались в такой ситуации:
У нас есть большая scala
кодовая база, все модели обеспечивают java
и scala
доступ.
Теперь у нас есть требование сценариев для 1-5% наших пользователей, где мы использовали kotlin скрипты (.kts), dsl, сопрограммы и функции приостановки
Мы предоставили script
конструкцию, внутри которой пользователи будут иметь доступ к полной DSL и всем моделям .
Мы не хотим, чтобы пользователи явно импортировали модели из разных файлов, и мы не хотим повторять определение моделей снова в kotlin.
Одно из решений, которое, по нашему мнению, могло бы работать в этом кейс имеет java моделей (это просто e делегируются моделям scala) и затем имеют один интерфейс на стороне kotlin, который простирается от всех этих интерфейсов java модели, и тогда script
может составлять receiver
этого интерфейса - AllModels