[jsword-devel] Java conundrum

Martin Denham mjdenham at gmail.com
Thu May 9 06:47:50 MST 2013


I can check in a fix if you like.

Martin


On 8 May 2013 15:58, DM Smith <dmsmith at crosswire.org> wrote:

> 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
>
>
>
> _______________________________________________
> 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/20130509/f07aa865/attachment.html>


More information about the jsword-devel mailing list