Java arraylist and polymorphism -


recently find questions java. 1 【a】

arraylist dates = new arraylist(); dates.add(new date()); dates.add(new string()); 

【b】

arraylist<date> dates = new arraylist<date>(); dates.add(new date()); dates.add(new string()); 

do these 2 pieces have compilation errors? guess there should wrong add(new string()) can't make sense clearly.

  1. i cannot find mistake in arraylist, return type of dates.get() wrong?

        arraylist dates = new arraylist();     dates.add(new date());     date date = dates.get(0); 

what if use (below)?

arraylist<date> dates = new arraylist<date>(); dates.add(new date()); date date = dates.get(0); 
  1. if student subtype of person, legal?

    person p = new student(); student s = new person(); list<person> lp = new arraylist<student>(); list<student> ls = new arraylist<person>(); 

i struggled these questions 2 days need give me explanation. in advance

for questions 1 , 2, key thing need learn generics.

if write

arraylist dates = new arraylist(); 

then raw type: compiler doesn't know sort of thing can put arraylist. when write

arraylist<date> dates = new arraylist<date>(); 

then compiler knows arraylist store instances of date, , can checking you're trying insert , retrieve date values. there both protect , avoid unnecessary gymnastics. second one, find that

dates.add(new string()); 

won't compile because compiler knows you're trying put of wrong type list. similarly, can write

date date = dates.get(0); 

because compiler knows what's inside date. first form, wouldn't case: compiler can't enforce type checking, , need cast when got out:

date date = (date) dates.get(0); 

using raw types can lead errors in program put wrong type in accident , compiler won't able stop you; , makes unnecessarily verbose when retrieve things because have casting yourself. think of generic type parameter (the <date> part) being way of enforcing can go into, , come out of, list. (technically, enforced compiler, , not runtime, that's lesson day... type erasure if you're interested.)

for code:

person p = new student(); student s = new person(); list<person> lp = new arraylist<student>(); list<student> ls = new arraylist<person>(); 

you hit 1 of annoying aspects of type system. although student subtype of person, doesn't mean arraylist<student> subtype of arraylist<person>. nice if so, it's not. so:

person p = new student(); 

this line above fine. student person, person reference can hold student instance.

student s = new person(); 

you can't line above, though. reference s has hold reference student; , person not student. give compile-time error.

list<person> lp = new arraylist<student>(); 

it nice if 1 worked, doesn't. if want arraylist<student> have have list<student> formal type of lp.

list<student> ls = new arraylist<person>(); 

this wouldn't work under circumstances, same reason second line failed: person isn't student, , list<student> can't expected hold isn't student.


Comments

Popular posts from this blog

java - Oracle EBS .ClassNotFoundException: oracle.apps.fnd.formsClient.FormsLauncher.class ERROR -

c# - how to use buttonedit in devexpress gridcontrol -

nvd3.js - angularjs-nvd3-directives setting color in legend as well as in chart elements -