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
ok thank you
rakesh sugirtharaj
Ranch Hand
Joined: Dec 16, 2007
Posts: 151
posted
0
Hi
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.
Cheers!
RSR
Dhaval Shah
Ranch Hand
Joined: Jun 10, 2005
Posts: 56
posted
0
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
posted
0
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.
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: http://ej-technologies/jprofiler - if it wasn't for jprofiler, we would need to
run our stuff on 16 servers instead of 3.