是否可以使用一个明确定义其类的类型的构造函数编写泛型类?
我试图这样做:
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();
}
}
答案 0 :(得分: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).
类本身无法预测此类使用,在这种情况下,最坏的情况(没有通用信息)被考虑。
答案 1 :(得分:4)
您当前的代码很容易导致无效状态(例如ComponentWrapper<SomeComponentThatIsNotAJLabel>
包裹JLabel
),这可能是编译器阻止您的原因。在这种情况下,您应该使用静态方法:
public static ComponentWrapper<JLabel> wrapLabel(final String title) {
return new ComponentWrapper<JLabel>(new JLabel(title));
}
在许多方面哪个更安全。