4

クラスの型を明示的に定義する1つのコンストラクターでジェネリッククラスを作成することは可能ですか?

これが私の試みです:

import javax.swing.JComponent;
import javax.swing.JLabel;

public class ComponentWrapper<T extends JComponent> {

    private T component;

    public ComponentWrapper(String title) {
        this(new JLabel(title));  // <-- compilation error
    }

    public ComponentWrapper(T component) {
        this.component = component;
    }

    public T getComponent() {
        return component;
    }

    public static void main(String[] args) {
        JButton button = new ComponentWrapper<JButton>(new JButton()).getComponent();
        // now I would like to getComponent without need to cast it to JLabel explicitly
        JLabel label = new ComponentWrapper<JLabel>("title").getComponent();
    }

}
4

2 に答える 2

5

あなたはそれをキャストすることができます:

public ComponentWrapper(String title) {
    this((T) new JLabel(title));
}

これは、一部のインスタンスで使用できなかった汎用情報によるものです。例えば:

new ComponentWrapper() // has 2 constructors (one with String and one with Object since Generics are not definied).

クラス自体はそのような使用を予測できません。この場合、最悪のケース (ジェネリック情報なし) が考慮されます。

于 2012-06-29T12:09:23.257 に答える
4

現在のコードは無効な状態 (たとえばComponentWrapper<SomeComponentThatIsNotAJLabel>、 a をラップするJLabelなど) に簡単につながる可能性があり、それがコンパイラがそこで停止する理由である可能性があります。この場合、代わりに静的メソッドを使用する必要があります。

public static ComponentWrapper<JLabel> wrapLabel(final String title) {
    return new ComponentWrapper<JLabel>(new JLabel(title));
}

これは、多くの点ではるかに安全です。

于 2012-06-29T12:25:32.650 に答える