[jsword-devel] Java conundrum

DM Smith dmsmith at crosswire.org
Wed May 8 07:58:04 MST 2013


That is the correct solution.

On May 7, 2013, at 11:14 AM, Martin Denham <mjdenham at gmail.com> wrote:

> Hi DM,
> 
> There are specific contains() implementations in VerseRange.  
>     public boolean contains(Verse that) {
>         return v11n.distance(start, that) >= 0 && v11n.distance(that, end) >= 0;
>     }
> 
>     public boolean contains(Key key) {
>         if (key instanceof VerseRange) {
>             return contains((VerseRange) key);
>         }
>         return false;
>     }
> 
> The second is being called but returns false because key is not a VerseRange. If the implementation of VerseRange.contains(Key) is the problem then another clause added at the end of the method might be one way to fix it, like:
>     public boolean contains(Key key) {
>         if (key instanceof VerseRange) {
>             return contains((VerseRange) key);
>         }
>         if (key instanceof Verse) {
>             return contains((Verse) key);
>         }
>         return false;
>     }
> 
> Martin
> 
> 
> On 7 May 2013 14:12, DM Smith <dmsmith at crosswire.org> wrote:
> Sorry for not replying earlier. Have been on holiday.
> 
> This conundrum should bee seen as a bug. Both should return the same value.
> 
> I have an idea of what is happening (I have a masters degree in computer science for compiler construction), but until I trace it I won't be sure. I think that it is compile time determination of what is being called.
> 
> In the gen_all case, it is known that it is a VerseRange and that VerseRange has a more specific contains(Verse). So that is called.
> 
> In the gen_allKey case, it is no longer a VerseRange but a Key (which should not know anything about a Verse, since it is supposed to work for all kinds of Keys). So it cannot call contains(Verse) but only contains(Key).
> 
> I'll see what I can find out.
> 
> -- DM
> 
> On May 4, 2013, at 5:34 AM, Martin Denham <mjdenham at gmail.com> wrote:
> 
> > Here is an interesting problem (based on VerseRangeTest.java):
> >
> >     private VerseRange gen_all = ...;
> >
> >     public void testKeyContainsVerse() {
> >         // this passes
> >         assertTrue(gen_all.contains(gen11));
> >
> >         // this fails
> >         Key gen_allKey = gen_all;
> >         assertTrue(gen_allKey.contains(gen11));
> >     }
> >
> > This caught me out for a while.  I think the second assert should pass but Key is an interface with a single non-overloaded contains():
> >     boolean contains(Key key);
> >
> > Whereas VerseRange contains overloaded methods like contains(Verse) that are not called because the Key interface is being used.  At least that is what I think is happening.
> >
> > Is this a bug?
> >
> > Martin
> >
> >
> >
> >
> > _______________________________________________
> > jsword-devel mailing list
> > jsword-devel at crosswire.org
> > http://www.crosswire.org/mailman/listinfo/jsword-devel
> 
> 
> _______________________________________________
> jsword-devel mailing list
> jsword-devel at crosswire.org
> http://www.crosswire.org/mailman/listinfo/jsword-devel
> 
> _______________________________________________
> jsword-devel mailing list
> jsword-devel at crosswire.org
> http://www.crosswire.org/mailman/listinfo/jsword-devel

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.crosswire.org/pipermail/jsword-devel/attachments/20130508/2af8e50e/attachment.html>


More information about the jsword-devel mailing list