You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Luc Maisonobe (JIRA)" <ji...@apache.org> on 2013/03/09 16:43:12 UTC

[jira] [Commented] (MATH-942) DiscreteDistribution.sample(int) may throw an exception if first element of singletons of sub-class type

    [ https://issues.apache.org/jira/browse/MATH-942?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13597980#comment-13597980 ] 

Luc Maisonobe commented on MATH-942:
------------------------------------

We have encountered the same kind of issue with Field implementations. For this reason, we have added the method:

{code}
Class<? extends FieldElement<T>> getRuntimeClass();
{code}

in the interface, so appropriate objects can be created (this is what is used in the buildArray method in MathArrays). However, we cannot do the same here because we want to allow any class in the distribution, not only implementations of one of our interfaces.

Passing the runtime class as an argument to the distribution would work, but seems also cumbersome.

I am a bit reluctant to use Object[] as your patch, though. Are you sure it would always work? I know type erasure occurs, but with your patch, we mainly apply it ourselves. Is it safe?
                
> DiscreteDistribution.sample(int) may throw an exception if first element of singletons of sub-class type
> --------------------------------------------------------------------------------------------------------
>
>                 Key: MATH-942
>                 URL: https://issues.apache.org/jira/browse/MATH-942
>             Project: Commons Math
>          Issue Type: Bug
>            Reporter: Piotr Wydrych
>         Attachments: DiscreteDistribution.java.patch
>
>
> Creating an array with {{Array.newInstance(singletons.get(0).getClass(), sampleSize)}} in DiscreteDistribution.sample(int) is risky. An exception will be thrown if:
> * {{singleons.get(0)}} is of type T1, an sub-class of T, and
> * {{DiscreteDistribution.sample()}} returns an object which is of type T, but not of type T1.
> To reproduce:
> {code}
> List<Pair<Object,Double>> list = new ArrayList<Pair<Object, Double>>();
> list.add(new Pair<Object, Double>(new Object() {}, new Double(0)));
> list.add(new Pair<Object, Double>(new Object() {}, new Double(1)));
> new DiscreteDistribution<Object>(list).sample(1);
> {code}
> Attaching a patch.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira