0

実装と拡張の両方を行うオブジェクトのマップを作成しようとしています。彼らが拡張しているクラス (JPanels) は、私には制御できません。ただし、インターフェイスを制御できます。

これは私が試したものです

Map<MyEnum, ? extends JPanel & MyInterface> myMap;

ただし、これはコンパイル時エラーです。

抽象クラスを作成し、それをサブクラスに拡張させることもできますが、それは少し面倒に思えます (そうですか?)。

記録のために、私はJava 6を使用しています

4

4 に答える 4

3

ただし、これはコンパイル時エラーです。

はい。ワイルドカードに複数の境界を与えることはできません。ワイルドカードを使用できる場所、および型パラメーターを使用できる場所にはいくつかの制限があります。型パラメーターには複数の境界を設定できますが、下限を設定することはできません。一方、ワイルドカードには下限がありますが、複数の境界はありません。

1 つのオプションは、型パラメーターをクラスの一部として宣言し、それに複数の境界を与えることです。

class MyClass<T extends JPanel & MyInterface> {
    Map<MyEnum, T> myMap;  // This would work fine now
}

以下も参照してください。

参考文献:

于 2013-10-10T20:36:19.630 に答える
1

抽象クラスを作成し、それをサブクラスに拡張させることもできますが、それは少し面倒に思えます (そうですか?)。

まったくありません。これで問題なく動作するはずです。

JPanel別のアプローチは、対象のメソッドを を使用するメソッドに結合するインターフェースを追加し、次のmyMapように使用することです。

interface MyPanelInterface extends MyInterface {
    void    updateUI();
}
...
class MySpecialPanel extends JPanel implements MyPanelInterface {
    ...
    // Implementation for updateUI() comes from JPanel
    // You are responsible for implementing the remaining methods.
}
...
Map<MyEnum, ? extends MyPanelInterface> myMap;
...
myMap.get(MyEnum.FIRST).updateUI();
于 2013-10-10T20:34:59.583 に答える
1

あなたも提案したように、JPanel を拡張して MyInterface を実装する独自のクラスを作成してから、使用する必要があります。 Map<? extends MyNewSuperClass> myMap;

于 2013-10-10T20:35:11.893 に答える
0

私はこれを行う必要はありませんでしたが、あなたが提案したように、必要なインターフェース/クラスを実装/拡張して新しいクラスまたはインターフェースを(必要に応じて)作成し、マップで使用することができます。

パブリック インターフェイス IWhatIneed は、Jpanel、MyInterface{ ... } を実装します。

その後:

Map<MyEnum, ? extends JPanel & MyInterface> myMap;

これが役立つことを願っています

于 2013-10-10T20:41:02.410 に答える