Concepts and Quiz on Generics ( com.enthuware.ets.scjp.v6.1.824 )

Help and support on OCA OCP Java Programmer Certification Questions
1Z0-808, 1Z0-809, 1Z0-815, 1Z0-816, 1Z0-817

Moderator: admin

Post Reply
admin
Site Admin
Posts: 8912
Joined: Fri Sep 10, 2010 9:26 pm
Contact:

Concepts and Quiz on Generics ( com.enthuware.ets.scjp.v6.1.824 )

Post by admin »

Note: This article assumes that you are clear about the is-a concept in OO. i.e. A subclass object is-a superclass. For example, an Integer is-a Number (because Integer extends Number). Thus, every Integer is-a Number but every Number is not necessarily an Integer. It could be a Double or Long (or any other Number) also.

Understanding Generics is quite simple, if you understand the following three basic principles:


1. The main purpose of having generics is to avoid putting random things into any collection. After all, you want things organized. You don't want to put apples in a sack of potatos. And when you are given a sack of apples, you expect apples to come out and not potatos. At the same time, if you are given a "basket of fruit" as a gift, you should be able to put an orange, an apple, a mcintosh apple, or any other fruit into it. Right? And when you pick a fruit from that basket, do you always expect to get an apple? No, right?

That's the fundamental thing and the hardest to absorb (I bet you are rolling your eyes ).

Now, the simpler stuff:

2. ? extends Apple: This means "of a class that extends Apple". Therefore, List<? extends Apple> means a sack of some variety of Apple. Mcintosh? Probably. But you don't know. In other words, "? extends Apple" does not mean "any class that extends Apple". It means a specific but unknown class that extends Apple.

Q. When you are given a sack of "? extends Apple", can you put a Mcintosh in it? If you have any doubt, read point 1 again. (Hint: Do you want to mess up your sack of Fuji apples by putting a Mcintosh apple it it?)
Answer: No, you can't put a Mcintosh apple in a sack of "? extends Apple" because what if the sack is of Fuji apples?

Q. When you take out stuff from a sack of "? extends Apple", what do you get? An Apple for sure. (You don't mind if it is a Mcintosh or a Fuji, do you? As long as you don't get a Potato, you are good.)
Answer: You get some kind of Apple. You don't know the exact kind. Therefore, you can assign it directly to a variable of type Apple but cannot assign it directly to a variable of type FujiApple. You will need to cast it to assign it to a variable of type FujiApple.

3. ? super Apple: This means "of a class that is a super class of Apple". Therefore, List<? super Apple> means a sack of something of which an Apple is a kind. Let's call it "it". So, What do you call a sack of something of which an Apple is a kind? A sack of fruits. Are you sure? Can you not call it a sack of food items? or A sack of Mcintoshes? (Hint: Every apple is a kind of fruit. Every apple is a kind of food item. Is every apple a kind of Mcintosh?) So which of these statements should work?

Code: Select all

listOfsuperApple.add(anApple); 
listOfsuperApple.add(someFruit); 
listOfsuperApple.add(aMac); 
Read 1 again, if in doubt.

Answer:

Code: Select all

listOfsuperApple.add(anApple); //Correct, because any apple can be put in a sack that is meant to store apples, fruits, or fooditems, or Objects. 
listOfsuperApple.add(someFruit); //Wrong, because what if the sack is of apples and someFruits is pointing to a PineApple?
listOfsuperApple.add(aMac); //Correct, because any apple can be put in a sack that is meant to store apples, fruits, or fooditems, or Objects. 
Q. When you take out stuff from a sack of "? super Apple", what do you get? Apple? Probably. A fruit? probably. Some food item? probably. Are you sure? No. So what are you sure of? Well, it is something, but you don't know what. So you are sure of nothing, really. So which of these statements should work?

Code: Select all

Apple a = listOfsuperApple.get(0); 
Fruit a = listOfsuperApple.get(0); 
FoodItem a = listOfsuperApple.get(0); 
Object a = listOfsuperApple.get(0); 
Read 1 again, if in doubt.
Answer:

Code: Select all

Apple a = listOfsuperApple.get(0); //Wrong, because you don't know the type of objects stored in the list. What if the list is of type FoodItems, and contains a PineApple as well?
Fruit a = listOfsuperApple.get(0); //Wrong, what if the list is of type FoodItems, and contains a Pizza?
FoodItem a = listOfsuperApple.get(0); //Wrong, what if the list is of type Object and contains a String?
Object a = listOfsuperApple.get(0); //Correct, because no matter what is stored in the list, it is definitely an Object!  


Quiz: What would List<?> mean? What can you put in it and what can you take out from it?
Answer <?> means something specific but not known. It doesn't mean "anything". It is like you get a sack from a fruit vendor and he tells you that it contains only a specific fruit, say Banana, but doesn't tell you exactly which fruit. It doesn't mean it contains various kinds of fruits. If he sent you a sack of bananas, you can't put any fruit it in because you don't know the exact type of fruit it contains. Similarly, when you take something out from the sack of <?>, you can't assign it to any specific class other than Object because you don't what exactly does the sack contain.


That's it! If you understand point 1 above, you will never miss any question on generics. Ever!
If you like our products and services, please help us by posting your review here.

Kostik
Posts: 2
Joined: Sat Oct 27, 2012 3:35 am
Contact:

Re: Concepts and Quiz on Generics ( com.enthuware.ets.scjp.v6.1.824 )

Post by Kostik »

The best explanation of wildcards which I have ever seen!
Thanks

admin
Site Admin
Posts: 8912
Joined: Fri Sep 10, 2010 9:26 pm
Contact:

Post by admin »

When to use ? super Apple and when to use ? extends Apple

Very easy - if you want to eat Apples from a bag, you should look for a bag of Apples. i.e use ? extends Apple. For example, List<? extends Apple>. This will allow you to take out Apples from the bag because you know that whatever you take out of this bag will definitely be an Apple. Remember, anything that extends Apple IS-A Apple.

If you want to dump Apples into a bag, you can dump them into a bag of Apples or into a bag of Fruits or into a bag of FoodItems. But you can't dump them into a bag of FujiApples, right? (Because not every Apple is a FujiApple, don't forget that!) In other words, use ? super Apple. For example, List<? super Apple>. This will let you add any Apple to the list.

Quiz
1. What can you dump into List<? extends Apple>?
2. What can you eat from List<? super Apple>? (Hint, can you eat Object?)
If you like our products and services, please help us by posting your review here.

Deepa

Re: Concepts and Quiz on Generics ( com.enthuware.ets.scjp.v6.1.824 )

Post by Deepa »

Do we have this topic Generics for OCAJP 7 exam?

admin
Site Admin
Posts: 8912
Joined: Fri Sep 10, 2010 9:26 pm
Contact:

Re: Concepts and Quiz on Generics ( com.enthuware.ets.scjp.v6.1.824 )

Post by admin »

Deepa wrote:Do we have this topic Generics for OCAJP 7 exam?
No.
If you like our products and services, please help us by posting your review here.

johnnie
Posts: 1
Joined: Wed Mar 25, 2020 3:34 pm
Contact:

Re: Concepts and Quiz on Generics ( com.enthuware.ets.scjp.v6.1.824 )

Post by johnnie »

IMHO this is the worst explanation ever, if people are coming here to understand that means they don`t understand how it works at the moment. It is very confusing giving them an bastract example of Apple and Mcintosh and then asking questions which are crucial to be answered, but are left unanswered.

admin
Site Admin
Posts: 8912
Joined: Fri Sep 10, 2010 9:26 pm
Contact:

Re: Concepts and Quiz on Generics ( com.enthuware.ets.scjp.v6.1.824 )

Post by admin »

Hi Johnnie, Thanks for your feedback. The answers have been added. Hope it is helpful to you now :)
If you like our products and services, please help us by posting your review here.

Post Reply

Who is online

Users browsing this forum: No registered users and 5 guests