Java 从超类的对象数组访问子类的函数

Java 从超类的对象数组访问子类的函数,java,Java,我有classCarte和Croyant,DeuxEx是Carte的子类。在Croyant和DeuxEx中,每个类中都有属性valueCroyant或valueDeuxEx。我创建了一个类Carte的Object数组。如何从该数组的对象访问方法getValueCroyant()或getValueDeuxEx() Class Carte { private int id; public Carte(int id){ this.id=id; } } Class

我有class
Carte
Croyant
DeuxEx
Carte
的子类。在
Croyant
DeuxEx
中,每个类中都有属性
valueCroyant
valueDeuxEx
。我创建了一个类
Carte
Object
数组。如何从该数组的对象访问方法
getValueCroyant()
getValueDeuxEx()

Class Carte {
    private int id;
    public Carte(int id){
        this.id=id;
    }
}
Class Croyant extends Carte{
    private int valueCroyant;
    public Croyant(int id){
        super(id);
    }
    public int getValueCroyant(){
        return this.valueCroyant;
    }
}
Class DeuxEx extends Carte{
    private String valueDeuxEx;
    public DeuxEx(int id){
      super(id); 
    }
    public String getValueDeuxEx(){
       return this.ValueDeuxEx;
    }
}
public static void main(String[] agrs){
    ArrayList<Carte> array_carte = new ArrayList();
    Croyant cr1 = new Croyant(1);
    Croyant cr2 = new Croyant(2);
    DeuxEx de1= new DeuxEx(3);
    DeuxEx de2 = new DeuxEx(4);
    array_carte.add(cr1);
    array_carte.add(cr2);
    array_carte.add(de1);
    array_carte.add(de2);
    for(Carte c:array_carte){
       if(c instanceof Croyant){
           System.out.println(c.getValueCroyant()); 
        }else{
           System.out.println(c.getValueDeuxEx()); 
        }
    }
}
类点菜{
私有int-id;
公共点菜(int id){
这个.id=id;
}
}
类Croyant扩展了Carte{
私人内部价值观;
公共克罗地亚人(国际身份证){
超级(id);
}
public int getValueCroyant(){
返回此.valueCroyant;
}
}
类DeuxEx扩展了Carte{
私有字符串valueDeuxEx;
公共DeuxEx(内部id){
超级(id);
}
公共字符串getValueDeuxEx(){
返回此.ValueDeuxEx;
}
}
公共静态void main(字符串[]agrs){
ArrayList数组_carte=新的ArrayList();
Croyant cr1=新Croyant(1);
Croyant cr2=新Croyant(2);
DeuxEx de1=新的DeuxEx(3);
DeuxEx de2=新的DeuxEx(4);
数组\点菜添加(cr1);
数组\点菜添加(cr2);
数组_-carte.add(de1);
数组_-carte.add(de2);
for(Carte c:array_Carte){
if(Croyant的c实例){
System.out.println(c.getValueCroyant());
}否则{
System.out.println(c.getValueDeuxEx());
}
}
}
我想做一个这样的for循环,但它不起作用。谁能帮帮我吗

c.getValueCroyant()不会编译,因为它的类型是Carte,即超类。
即使它不优雅,调用这个方法,使用instanceOf也很好,但是您还必须对Croyant进行强制转换

我认为您应该进行强制转换。所显示的代码段将不会编译

大概是这样的:

for(Carte c:array_carte){
       if(c instanceof Croyant){
           System.out.println(((Croyant)c).getValueCroyant()); 
        }else if(c instanceof DeuxEx){
           System.out.println(((DeuxEx)c).getValueDeuxEx()); 
        }
    }

检查我的答案。

您试图做的事情强烈暗示您的设计存在问题。另一个答案中的建议是使用
instanceof
和casting进行测试,但这是非常反OO的。基本上,这种解决方案避免了多态性


我看到
valueCroyant
int
valueDeuxEx
字符串。最好的解决方案是重新考虑您的设计,使这些值要么是相同的类型,要么实现一些公共接口。然后将值和getter移动到公共超类
Carte
。如果不可能用同一类型来表示两个值,那么就给
Carte
一个抽象方法,用于对值进行处理,并在每个子类中以不同的方式实现它。

该代码甚至不会编译。你所说的“束”也可能是指“环”。Google和Google translate是您在这里的朋友。您的
main()
是这里的一部分,还是您只是在尝试执行此代码?请根据OPs问题详细说明答案,如果这看起来与其他类似,请标记重复link@nullpointer谢谢我编辑以显示我所指的类型转换。(Croyant)c工作得很好。这就是我发现的。多谢各位^^