我有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
}
}
答案 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)
问题在于:
NormalDistribution
和BinomialDistribution
类没有一个具有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];
}