4

是否可以使用一个明确定义其类类型的构造函数来编写泛型类?

这是我的尝试:

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 回答