[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