Home
Reading
Searching
Subscribe
Sponsors
Statistics
Posting
Contact
Spam
Lists
Links
About
Hosting
Filtering
Features Download
Marketing
Archives
FAQ
Blog
 
Gmane
From: Neil Bartlett <neil <at> integility.com>
Subject: Re: Thanks Stepan! (was: Re: [jira] Resolved: (HARMONY-454) [classlib][luni] java.util.Set generics uplift and related changes)
Newsgroups: gmane.comp.java.harmony.devel
Date: Thursday 11th May 2006 08:56:28 UTC (over 11 years ago)
Nathan,

It's a tricky one to be sure.

The problem is that the entrySet() method is returning a
"Set>",
which is incompatible with the type "Set>". It's easier to describe why if I drop the "extends K"
and "extends V" part. So we have "Set" and
"Set>".

The first one, "Set>" is a set of Map.Entries of
different types - ie it is a heterogeneous collection. It could
contain a Map.Entry and a Map.Entry>
and any other pair of types, all in the same set.

On the other hand, "Set>" is a
homogenous collection of the same (albeit unknown) pair of types. Eg
it might be a Set>, so all of the entries in the
set MUST be Map.Entry.

In general, even if you could assign this to a local variable without
unchecked type safety warnings, you wouldn't be able to call any
methods on it because the compiler cannot check whether the access is
type-safe. For example you would not be able to call add() because the
Set must contain a specific type, but the compiler doesn't know which
specific type that is!

Regards
Neil

On 5/11/06, Nathan Beyer  wrote:
> Does someone understand why this works this way? This seems so odd. I
know
> there are quirks to the generics syntax, but this in an edge I haven't
run
> into yet. I haven't been able to make this one click in my head yet.
>
> This compiles fine:
>         public synchronized void putAll(Map map)
{
>         for (Map.Entry entry : map.entrySet()) {
>               ...
>         }
>         }
>
> This won't compile at all:
>         public synchronized void putAll(Map map)
{
>         Set> entries =
map.entrySet();
>         ...
>       }
> The error is: Type mismatch: cannot convert from Set extends K,capture-of ? extends V>> to Set V>>
> The suggested quick fix in Eclipse is "Set entries = ...".
>
> This reports a warning:
>         public synchronized void putAll(Map map)
{
>         Map map2 = (Map)map;
>       }
> The warning is: Type safety: The cast from Map K,capture-of ? extends V> to Map is actually checking against the
> erased type Map
> The suggested quick fix in Eclipse is to the annotation:
> @SuppressWarnings("unchecked").
>
> -Nathan
>
>
> > -----Original Message-----
> > From: Tim Ellison [mailto:[email protected]]
> > Sent: Wednesday, May 10, 2006 6:59 AM
> > To: [email protected]
> > Subject: Thanks Stepan! (was: Re: [jira] Resolved: (HARMONY-454)
> > [classlib][luni] java.util.Set generics uplift and related changes)
> >
> > Stepan Mishura (JIRA) wrote:
> > 
> > > 2) To avoid casting while-loop was replaced with for-loop. Could you
> > review the change?
> >
> > I was scratching my head about this cast, so I was very pleased to see
> > your elegant solution.
> >
> > I must admit that I don't really understand why the for-loop version is
> > inherently different (other than it 'hides' the casting) -- but I've
> > learned a new pattern there :-)
> >
> > Regards,
> > Tim
> >
> > --
> >
> > Tim Ellison ([email protected])
> > IBM Java technology centre, UK.
> >
> >
> > ---------------------------------------------------------------------
> > Terms of use : http://incubator.apache.org/harmony/mailing.html
> > To unsubscribe, e-mail: [email protected]
> > For additional commands, e-mail: [email protected]
>
>
> [email protected]----
> Terms of use : http://incubator.apache.org/harmony/mailing.html
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>


-- 
Neil Bartlett
Senior Technical Consultant, Integility Ltd
Tel: +44 (0) 20 7043 8328
Fax: +44 (0) 20 7043 8329

LinkedIn Profile: https://www.linkedin.com/in/neilbartlett
 
CD: 3ms