File APIs for Java Developers
Manipulate DOC, XLS, PPT, PDF and many others from your application.
The moose likes Java in General and the fly likes Generics Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login
JavaRanch » Java Forums » Java » Java in General
Bookmark "Generics" Watch "Generics" New topic


Rambabu Gonela

Joined: Jul 31, 2006
Posts: 24
Hi Friends..

i am really confusing with this generics,

see the below example

class C{}
class A extends C{}
class Impl {
void method(){
ArrayList<? extends C> arl = new ArrayList<A>();
arl.add(new A());//compile time error;

why its giving compile time error , already arl is type A arrayList means we can store the A class Objects, right?...

really i am confusing this senario.. pls help me the same.....
please give me detail explanation

thank you
rakesh sugirtharaj
Ranch Hand

Joined: Dec 16, 2007
Posts: 151

I think that is not allowed becoz it compromises type safety. If it is allowed, i can create a and then and that would break type safety. Exercise caution while using wildcards.

Dhaval Shah
Ranch Hand

Joined: Jun 10, 2005
Posts: 56
When you use extends to denote a type parameter bound, you are not requiring a
subclass-superclass relationship, but merely a subtype-supertype relationship. It is also important to remember that the bounded type does not need to be a strict subtype of the bound; it could be the bound as well.

In other words, for a Collection<? extends Number>, you could assign a Collection<Number> (although Number is not a strict subtype of Number) as well as a Collection<Integer>, Collection<Long>, Collection<Float>, and so on but you can not assign a Collection <Object> even though Object is a superclass of Number

Thanks and Regards,<br />Dhaval Shah<br />SCJP 1.4<br />SCWCD 1.4
Pavel Cherkashin
Ranch Hand

Joined: Mar 04, 2005
Posts: 47
Consider piece of code with comments.

Read the point 4 (about wildcards) of the generics tutorial - there is a good and quite detailed explanation of this situation.

Pavel Cherkashin - <br />SCJP, SCWCD, SCDJWS, SCBCD, SCEA, ...<br />
gaurav abbi
Ranch Hand

Joined: Jan 05, 2007
Posts: 108
this is because at runtime, there is no difference between a generics collection and a non-generics collection. (Type erasure)
ArrayList<? extends C> arl
is as good as
ArrayList arl
at runtime.
if there is no compile time error, then anything can be added to collection at runtime which will break the type safety. So normally you will no be able to assign a ArrayList<C> arl = new ArrayList<A>,
but the wildcards '?' allow you to do the assignment and with extends it can be read only, you can't do structural modifications.

consider the example

Hope this will clear your doubt.

thanks,<br />gaurav abbi
I agree. Here's the link:
subject: Generics
It's not a secret anymore!