问题
I have a strange problem with inheritance and I don't understand why it should not work:
public interface A { }
public interface B extends A {}
public class C {
void test() {
ArrayList<A> foo = new ArrayList<B>();
}
}
But compiling gives me the following error
Type mismatch: cannot convert from ArrayList<B> to ArrayList<A> C.java /bla/src/de/plai/test line 8 Java Problem
回答1:
ArrayList<? extends A> foo = new ArrayList<B>();
A List of A is not the same that a List of B because you could not guarantee consistency of contents in the list.
Namely, if it were possible you could insert an item of type A in a list that was instantiated only to contain B elements.
Of course the above declaration will prevent you from writing any elements into the list. This is a read-only declaration.
Also it is a good OOP principle to declare the variables as interfaces, not implementations:
List<? extends A> foo = new ArrayList<B>();
回答2:
It may seem counterintuitive at first, but even if class B
is a subclass of A
, a List<B>
is not a subclass of List<A>
. I gave a more detailed explanation and example in this earlier answer to a similar post. See also this other answer for a link to the respective item in Effective Java 2nd Edition.
The solution to this problem is using wildcards. Thus you should declare your list as
List<? extends A> foo = new ArrayList<B>();
回答3:
Was just above to to post the same :) well nevertheless.. the answer is same this should work for you.
ArrayList<? extends A> foo = new ArrayList<B>();
来源:https://stackoverflow.com/questions/5612157/java-inheritance-with-parameterized-lists