harmony-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Sian January" <sianjanu...@googlemail.com>
Subject Re: [classlib] HashMap
Date Fri, 21 Sep 2007 13:49:57 GMT
OK, so Harmony's implementation of HashMap requires iterator() to return a
HashMap.Entry (which is not a public class) and the subclass returns an
incompatible type.

I assume this works on the RI, and I don't think it's unreasonable to want
to extend HashMap so it would probably be good to fix this in Harmony.
However assuming you're talking about line 732 you can't just change
"Entry<?, ?> entry = (Entry<?, ?>) iterator.next()" to "Map.Entry..."
because the code below won't compile properly if you do that.

If you would like someone to take a look at this in more depth, the best
thing to do would probably be to create a JIRA report with a description of
the problem and a small failing test case -
http://issues.apache.org/jira/browse/HARMONY.



On 21/09/2007, Rachel Chen <rechel88@gmail.com> wrote:
>
> Hi, Sian
> I am sorry that I didn't make myself clear enough in the first mail.
> When the exception happens here, it says MapEntryImpl is incompatiable
> with
> HashMap.MapEntry
> Because in these clause Entry<?, ?> entry = (Entry<?, ?>) iterator.next(),
> it returns a MapEntryImpl  which can not be assigned to Entry<?,?>. Since:
> HashMap.Entry extends MapEntry, MapEntry implements Map.Entry
> MapEntryImpl implements Map.Entry
>
>
> On 9/21/07, Sian January <sianjanuary@googlemail.com> wrote:
> >
> > Hi Rachel,
> >
> > Sorry - you mentioned the writeObject method, so I assumed that's where
> > the
> > exception was being thrown from.  Is it actually coming from the
> iterator
> > method?  It would be helpful if you could post a stack trace.  Even so,
> I
> > think if we did change the iterator method you might have problems
> > elsewhere
> > in the class, but it's difficult to say without knowing what exactly the
> > exception is.
> >
> > Thanks,
> >
> > Sian
> >
> >
> > On 21/09/2007, Rachel Chen < rechel88@gmail.com> wrote:
> > >
> > > Hi , Sian
> > > Thank you for your suggestion. But I still don't understand.
> > > Yes, It seems the entries are instances of HashMap.Entry
> > > But I traced the code. Here is how the iterator comes: Iterator<?>
> > > iterator
> > > = entrySet().iterator();
> > > public Set<Map.Entry<K, V>> entrySet() {
> > >        return new HashMapEntrySet<K, V>(this);
> > >    }
> > > public Iterator<Map.Entry<KT, VT>> iterator() {
> > >            return new HashMapIterator<Map.Entry <KT, VT>, KT, VT>(
> > >                    new MapEntry.Type<Map.Entry<KT, VT>, KT, VT>()
{
> > >                        public Map.Entry<KT, VT> get(MapEntry<KT, VT>
> > > entry)
> > > {
> > >                            return entry;
> > >                        }
> > >                    }, associatedMap);
> > >        }
> > > So I don't know why it is necessary to use Entry<?, ?> entry =
> (Entry<?,
> > > ?>)
> > > iterator.next(),why can not Map.Entry<?,?>
> > > Thanks.
> > >
> > > On 9/21/07, Sian January <sianjanuary@googlemail.com > wrote:
> > > >
> > > > Hi Rachel,
> > > >
> > > > From looking at HashMap it looks it depends on the fact that the
> > entries
> > > > are
> > > > instances of HashMap.Entry (i.e. by using the 'next' field), so it's
> > not
> > > > just as simple as changing the type to be Map.Entry.  It would
> require
> > > > quite
> > > > a lot of changes to HashMap so I think it might be easier to fix in
> > > > common-chain (e.g. by overriding the writeObject method), unless
> > anyone
> > > > thinks that HashMap is designed to be extended in this way, in which
> > > case
> > > > we
> > > > should fix it in Harmony.
> > > >
> > > > Thanks,
> > > >
> > > > Sian
> > > >
> > > >
> > > > On 21/09/2007, Rachel Chen < rechel88@gmail.com> wrote:
> > > > >
> > > > > Hello,
> > > > > I got a exception when I run test common-chain which is also a
> > project
> > > > > under
> > > > > ASF.
> > > > > I found out that is how it happens: We have a interface
> Map.Entryand
> > > > > Class
> > > > > MapEntry implements Map.Entry and a inner class of HashMap called
> > > Entry
> > > > > extends MapEntry. Here comes the problem: a class in common-chain
> > > called
> > > > > ContextBase extends HashMap and one of its inner classes
> > > > > MapEntryImpl implement Map.Entry. When ContextBase call a method
> > > > > writeObject in HashMap which has such a clause Entry<?, ?>
entry =
> > > > > (Entry<?,
> > > > > ?>) iterator.next(), stream goes back to ContextBase and returns
> > like
> > > > this
> > > > > Map.Entry entry= ContextBase.this.entry(keys.next())(this one is
a
> > > > > MapEntryImpl).
> > > > > To fix this bug, Can I just simply modify  Entry<?, ?> entry
=
> > > (Entry<?,
> > > > > ?>)
> > > > > iterator.next() to Map.Entry<?,?>=(Map.Entry<?, ?>) iterator.next
> ()
> > ?
> > > > > Any comments and suggestion? Thank you.
> > > > >
> > > >
> > > >
> > > >
> > > > --
> > > > Unless stated otherwise above:
> > > > IBM United Kingdom Limited - Registered in England and Wales with
> > number
> > > > 741598.
> > > > Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire
> PO6
> > > 3AU
> > > >
> > >
> >
> >
> >
> > --
> > Unless stated otherwise above:
> > IBM United Kingdom Limited - Registered in England and Wales with number
> > 741598.
> > Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6
> 3AU
> >
>



-- 
Unless stated otherwise above:
IBM United Kingdom Limited - Registered in England and Wales with number
741598.
Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6 3AU

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message