如何使用被Java根类掩盖的对象调用原始类方法,即Object类?

时间:2016-11-11 23:02:09

标签: java arraylist

我有Object类型列表,它包含org.apache.commons.math3库的NormalDistribution和BinomialDistribution类的对象。现在我想在这些对象上调用sample()方法,但是当我调用该方法时,它会抛出一个错误,因为对象没有定义sample()。如何在不更改列表列表类型的情况下使其工作(因为我想将属于不同类的对象存储在单个列表列表中)?

 ArrayList<ArrayList<Object>> distributions = new ArrayList<ArrayList<Object>>();
    distributions=[[new NormalDistribution(24,10),new NormalDistribution(100,5)],[new BinomialDistribution(160,0.8)]];
for(int i=0;i<distributions.size();i++){
for(int j=0;j<distributions.get(i).size();j++){
double value = (distributions.get(i).get(j)).sample();//sample() is undefined for the Object    
}
}

2 个答案:

答案 0 :(得分:0)

您必须键入将对象强制转换为正确的类。在您的示例中,distributions.get(0).get(1)将为您提供类NormalDistribution的对象。因此,请将其输入NormalDistribution

((NormalDistribution)(distributions.get(0).get(1))).sample()

如果您不知道要在运行时键入强制转换的类,并且没有通用接口,请尝试使用Java反射。

Object obj = distributions.get(0).get(1)
java.lang.reflect.Method method = obj.getClass().getMethod("sample");
double value = method.invoke();

答案 1 :(得分:0)

问题在于:

NormalDistributionBinomialDistribution类没有一个具有sample()方法的公共超类。一个是RealDistribution的子类型,另一个是IntegerDistribution的子类型。相应的sample()方法返回不同的类型;分别是double[]int[]

所以你需要的是这样的东西:

    double sample;
    if (distribution instanceof RealDistribution) {
        sample = ((RealDistribution) distribution).sample()[i];
    } else {
        // The int sample value is converted to a double in the assignment.
        sample = ((IntegerDistribution) distribution).sample()[i];
    }