user3170606
user3170606

Reputation: 5

List Polymorphism

I have these classes:

class Parent {
    public Parent() {
    }
}

class ChildA extends Parent {
    public ChildA() {
        super();
    }
}

class ChildB extends Parent {
    public ChildB() {
        super();
    }
}

public ListClas(List(Parent) list)   {
    this.list=list;
    }
}

And I want to run ListClas constructor as below.

List<ChildA> list_childA = new ArrayList<ChildA>();

List<ChildB> list_childB = new ArrayList<ChildB>();

ListClas listClasA = new ListClas(list_childA);

ListClas listClasB = new ListClas(list_childB);

But the compiler throws an error. How do I do this correctly using polymorphism?

Upvotes: 0

Views: 120

Answers (4)

Mike B
Mike B

Reputation: 5451

I think you want your ListClas to look something like this:

class ListClas<T>
{
    private List<T> list;

    public ListClas(List<T> list)
    {
        this.list = list;
    }
}

Then to create them:

ListClas<ChildA> listClasA = new ListClas<ChildA>(list_childA);
ListClas<ChildB> listClasB = new ListClas<ChildB>(list_childB);

The T is a generic type designation. It allows you to use the same class for multiple runtime types. So you can do the above instead of having to write this:

class AListClas
{
    private List<ChildA> list;

    public AListClas(List<ChildA> list)
    {
        this.list = list;
    }
}

class BListClas
{
    private List<ChildB> list;

    public BListClas(List<ChildB> list)
    {
        this.list = list;
    }
}

If you don't need quite as much flexibility you could write your ListClas like this:

class ListClas
{
    private List<? extends Parent> list;

    public ListClas(List<? extends Parent> list)
    {
        this.list = list;
    }
}

and use it like this:

ListClas listClasA = new ListClas(list_childA);
ListClas listClasB = new ListClas(list_childB);

Upvotes: 0

oceansize
oceansize

Reputation: 729

If you change to List<? extends Parent> list (also change ListClas.list field definition) in your ListClas then it will compile and work.

Upvotes: 1

user2693979
user2693979

Reputation: 2542

If you want a function that accepts List containing subclasses of a superclass you should use syntax.

public ListClas(List<? extends Parent> list){
    this.list=list;
}

It will accept both of them.

ListClas listClasA = new ListClas(list_childA);

ListClas listClasB = new ListClas(list_childB);

Upvotes: 1

MariuszS
MariuszS

Reputation: 31567

All of them: List<Parent>, List<ChildA> and List<ChildB> are different concrete parameterized type.

You can read more about this here: https://stackoverflow.com/a/20940807/516167

Upvotes: 0

Related Questions