2017-06-17 12 views
3

私はスウィングの表情に取り組んでいます& kotlinを使っている気分です。 UIを作成するために、スイングは、次のシグネチャを持つ静的メソッドcreateUI有することが必要ですKotlin @Jvmコンパニオンオブジェクト内の静的で偶発的なオーバーライド

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

をし、それは、スイングコードにリフレクションを介して呼び出される:

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! 

これを回避する方法はあります場合?

+0

'@JvmStatic override fun createUI'を試しましたか? – shiftpsh

+0

@shiftpshオブジェクト宣言内では適用できません。 – dimafeng

答えて

3

それはkotlin bug KT-12993です。残念ながら、バグはまだ修正されていません。 を使用してButtonUIを実装するか、とkotlinの間で切り替えることで、kotlinがあなたのUIロジックを実装できるようにする場合に問題を解決できます。たとえば、ピアと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 
    } 
} 

あなたは実装により半ダースのメソッドを持って場合は、Proxy Design Patternだけのデリゲートを使用することができますkotlinに実装されているターゲットButtonUIへのリクエスト(多くの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()); 
    } 
} 
+0

お返事ありがとうございます。私があなたが参照しているバグが同じ問題を記述しているのかどうかはわかりません。私は回避策としてjavaにフォールバックを使用していますが、私はより確かなアプローチを探しています。 – dimafeng

+0

@dimafengこれは実際には[バグ](https://youtrack.jetbrains.com/issue/KT-12993)です。 –

関連する問題