Casting a Generic List

B

Bryan

Hello all,

Is it possible to cast an entire Generic List somehow? For example,
say I have the following:

public interface Foo {
.....
}

public class Bar implements Foo {
....
}

public class Test {
public List<Foo> getFooList() { .... }

public static void main(String[] args) {
Test test = new Test();

List<Bar> bars = test.getFooList(); // illegal
}
}

Now assume that all the objects in the FooList were indeed
instantiated as Bar objects.

I get a compile error saying it can't convert from List<Foo> to
List<Bar>. I could always just get a list of Foo objects and cast
them to Bars myself, but I'm just wondering if it can be done for me
all at once.

Any suggestions?
 
I

Ingo R. Homann

HI,
Hello all,

Is it possible to cast an entire Generic List somehow? For example,
say I have the following:

public interface Foo {
.....
}

public class Bar implements Foo {
....
}

public class Test {
public List<Foo> getFooList() { .... }

public static void main(String[] args) {
Test test = new Test();

List<Bar> bars = test.getFooList(); // illegal
}
}

Now assume that all the objects in the FooList were indeed
instantiated as Bar objects.

I get a compile error saying it can't convert from List<Foo> to
List<Bar>. I could always just get a list of Foo objects and cast
them to Bars myself, but I'm just wondering if it can be done for me
all at once.

Any suggestions?

Not every Foo is a Bar, so of course such an assignment (or even a cast)
is impossible. (Note that for a similar (but slightly more difficult)
reason the opposite cast is impossible as well.)

Ciao,
Ingo
 
D

Daniel Pitts

Hello all,

Is it possible to cast an entire Generic List somehow? For example,
say I have the following:

public interface Foo {
.....

}

public class Bar implements Foo {
....

}

public class Test {
public List<Foo> getFooList() { .... }

public static void main(String[] args) {
Test test = new Test();

List<Bar> bars = test.getFooList(); // illegal
}

}

Now assume that all the objects in the FooList were indeed
instantiated as Bar objects.

I get a compile error saying it can't convert from List<Foo> to
List<Bar>. I could always just get a list of Foo objects and cast
them to Bars myself, but I'm just wondering if it can be done for me
all at once.

Any suggestions?

If you know that every Foo in the foo list is a Bar, then the only way
to get a List<Bar> object is to copy all elements from one to the
other, casting as you go.

You can "cheat", but you'd likely introduce bugs. List<Bar> bars
=(List<Bars>)(List)foos;
In general, don't do this.

This brings up the point. If you know that every Foo in a list is a
Bar, why not start with a List<Bar> instead of List<Foo>

Even if you don't know that before a class is instantiated, there are
ways around it.

class FooHolder<T extends Foo> {
private List<T> list;
// ...

public List<T> getFoos() {
return list;
}
public static void main(String...args) {
FooHolder<Bar> fh = new FooHolder<Bar>();
// Look ma, no casting!
List<Bar> bars = fh.getFoos();
}
}
 
B

Bryan

Daniel,

Awesome... your second suggestion is what I was looking for.

Thank you very much!

Bryan
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,774
Messages
2,569,596
Members
45,143
Latest member
SterlingLa
Top