Kotlin @JvmStatic и случайное переопределение в сопутствующем объекте

Я работаю над взглядом Swing и чувствую, используя котлин. Чтобы создать пользовательский интерфейс, Swing требует наличия статического метода createUI со следующей подписью:

 class ButtonUI: BasicButtonUI() { ... companion object { @JvmStatic fun createUI(p0: JComponent): ComponentUI { ... } } } 

и затем он вызывается через отражение в коде Swing:

 m = uiClass.getMethod("createUI", new Class[]{JComponent.class}); 

К сожалению, код выше не может быть скомпилирован компилятором kotlin из-за:

 Error:(88, 9) Kotlin: Accidental override: The following declarations have the same JVM signature (createUI(Ljavax/swing/JComponent;)Ljavax/swing/plaf/ComponentUI;): fun createUI(c: JComponent): ComponentUI fun createUI(p0: JComponent!): ComponentUI! 

Есть ли обходной путь для этого случая?

это kotlin ошибка KT-12993 . К сожалению, ошибка еще не исправлена. просто используя java реализует ваш ButtonUI или переключаюсь между java и kotlin на решение проблемы, если вы хотите, чтобы kotlin реализовал вашу логику ui. например, вы должны определить одноранговое соединение между java и kotlin.

код java, как показано ниже:

 public class ButtonUI extends BasicButtonUI { private ButtonUIPeer peer; public ButtonUI(ButtonUIPeer peer) { this.peer = peer; } @Override public void installUI(JComponent c) { peer.installUI(c, () -> super.installUI(c)); } // override other methods ... public static ComponentUI createUI(JComponent c) { // create the peer which write by kotlin // | return new ButtonUI(new YourButtonUIPeer()); } } interface ButtonUIPeer { void installUI(Component c, Runnable parentCall); //adding other methods for the ButtonUI } 

код kotlin, как показано ниже:

 class YourButtonUIPeer : ButtonUIPeer { override fun installUI(c: Component, parentCall: Runnable) { // todo: implements your own ui logic } } 

Если у вас есть более полутора десятков методов для реализации, вы можете использовать шаблон прокси-дизайна просто делегировать запрос целевому ButtonUI который реализован в kotlin (многие IDE-поддержка генерирует методы делегирования для поля). например:

 public class ButtonUIProxy extends BasicButtonUI { private final BasicButtonUI target; //1. move the cursor to here ---^ //2. press `ALT+INSERT` //3. choose `Delegate Methods` //4. select all public methods and then click `OK` public ButtonUIProxy(BasicButtonUI target) { this.target = target; } public static ComponentUI createUI(JComponent c){ // class created by kotlin ---v return new ButtonUIProxy(new ButtonUI()); } } 
Intereting Posts
ArgumentCaptor vs InOrder для проверки последующих обратных вызовов с разными аргументами Android-проводник: как сохранить состояние просмотров изменений ориентации kotlin получает подписчика для наблюдения наблюдаемого с помощью RxJava2 Котлин с разным приращением Может ли перегрузка операторов сравнения в Kotlin использоваться для реализации SQL-подобных функций? Единичное тестирование сопрограммы Kotlin с задержкой Получить ссылку на класс из функции верхнего уровня в kotlin Исключение NullPointerException при попытке доступа к унаследованному полю Расширение класса данных Kotlin для использования с JPA? Синтетическое расширение Kotlin и несколько включают в себя одну и ту же компоновку Не может быть возврата внутри Runnable SAM в Котлин? как использовать DecoratingStringHashMapper с kotlin? Не удалось написать JSON: не удалось десериализовать; вложенное исключение Как я могу получить случайное число в Котлине? Библиотека Kotlin 'classes.jar' имеет неподдерживаемый формат. Обновите библиотеку или плагин