我有一个名为 Parameter 的父类(super class)。有许多不同类型的参数,当然它们有不同的方法。问题是我将参数初始化为子类事件之一,但它仍然不允许我使用子类事件!
package com.lbg.c2;
public class Parameter {
private String type;
public static final Parameter NumberParam = new NumberParam();
public static final Parameter StringParam = new StringParam();
public static final Parameter AnyTypeParam = new AnyTypeParam();
public static final Parameter AnimationParam = new AnimationParam();
public static final Parameter AudioParam = new AudioParam();
public static final Parameter CmpParam = new CmpParam();
public static final Parameter ComboOptionParam = new ComboOptionParam();
public static final Parameter ComboParam = new ComboParam();
public static final Parameter KeybParam = new KeybParam();
public static final Parameter LayerParam = new LayerParam();
public static final Parameter LayoutParam = new LayoutParam();
public static final Parameter ObjectParam = new ObjectParam();
public Parameter () {
}
public Parameter (String t) {
type = t;
}
public String getType() {
return type;
}
public static Parameter init (String t) {
if (t.equals("number")) {
return NumberParam;
}
else if (t.equals("string")) {
return StringParam;
}
else if (t.equals("any type")) {
return AnyTypeParam;
}
else if (t.equals("animation")) {
return AnimationParam;
}
else if (t.equals("audio")) {
return AudioParam;
}
else if (t.equals("comparision")) {
return CmpParam;
}
else if (t.equals("combo option")) {
return ComboOptionParam;
}
else if (t.equals("combo")) {
return ComboParam;
}
else if (t.equals("keyboard")) {
return KeybParam;
}
else if (t.equals("layer")) {
return LayerParam;
}
else if (t.equals("layout")) {
return LayoutParam;
}
else if (t.equals("object")) {
return ObjectParam;
}
else {
return new Parameter();
}
}
}
此方法在 Parameter 类中静态找到,因此您可以从传递的字符串中初始化它。
add.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String types [] = {"number","string","any type","comparision","combo option",
"combo","object","layer","layout","keyboard","animation","audio"};
JComboBox<String> box = new JComboBox<String>(types);
JLabel text = new JLabel ("Select the parameter type:\n");
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(text, BorderLayout.NORTH);
panel.add(box, BorderLayout.SOUTH);
JOptionPane.showMessageDialog(frame, panel, "New Parameter", JOptionPane.QUESTION_MESSAGE);
Parameter p = Parameter.init((String) box.getSelectedItem());
if (p instanceof NumberParam || p instanceof StringParam || p instanceof AnyTypeParam) {
String label = JOptionPane.showInputDialog(frame,"Parameter Label?","New Parameter",JOptionPane.QUESTION_MESSAGE);
p.setLabel(label); // it says it needs casting!!
}
}
});
现在,Parameter 静态方法必须返回 Parameter 类的子类,但它仍然不允许我这样做。但现在它是一个子类,为什么它不允许我使用它的方法?
这就像说你是一个设备,然后我将你子类为电话,你不能调用其他人,因为你仍然被称为设备
最佳答案
父类永远无法知道从它继承的子类是谁。如果您在 Child
类中定义了一个方法,则该方法只能由 Child
类实例访问/调用。但反之则不然,如果在父类
中定义了一个方法,则所有子类
实例都可以访问/调用它。
例如:-
Object o = new String("Hi"); //will work because Object is parent class of String
o.trim(); // can't call/will give compilation error because parent Object does not know child String's trim()
if(o.getClass().equals(String.class) ){ // check actual runtime class of o
String ss = (String) o; //typecasting
System.out.println(ss.trim()); // will work on String object
}
关于java - 如何在父类(super class)中使用子类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31232538/