java - Return subclass when superclass is defined as return type -


in extension of question same topic: is list<dog> subclass of list<animal>? why aren't java's generics implicitly polymorphic? had follow-up question.

given have classes animal - parent dog - child

why can't return list when defined return type list?

    private class animal{};      private class dog extends animal{};        public list<animal> makeanimallistofdogs(dog dog1, dog dog2){             list<dog> dogs = new list<dog>;             dogs.add(dog1);             dogs.add(dog2);             return dogs;         } 

this might seem useless example, clarify problem. if try this, error:

type mismatch: cannot convert list<dog> list<animal> 

it off course possible replacing return dogs following snippet

list<animal> animals = new arraylist<animals>(); animals.addall(dogs) return animals; 

so problem not how make work, why doesn't work. list dogs list containing animals, given fact dog animal, right?

see john skeet's answer question linked yourself:


no, list<dog> not list<animal>. consider can list<animal> - can add any animal it... including cat. now, can logically add cat litter of puppies? absolutely not.

// illegal code - because otherwise life bad list<dog> dogs = new list<dog>(); list<animal> animals = dogs; // awooga awooga animals.add(new cat()); dog dog = dogs.get(0); // should safe, right? 

suddenly have very confused cat.

now, can't add cat list<? extends animal> because don't know it's list<cat>. can retrieve value , know animal, can't add arbitrary animals. reverse true list<? super animal> - in case can add animal safely, don't know might retrieved it, because list<object>.


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 -