Can I add to a generic collection of type A values of type B ,which extends A, without any special syntax?
Asked Answered
P

3

2
public class Stack<E> {
    public Stack () {....}
    public void push (E e) {....}
    public E pop () {....}
    public boolean isEmpty(){....}
}

public void pushAll (Collection<E> src) {
    for (E e: src){
        push(e)
    }
}

I don't understand what will the problem if I'll write

Stack<number> numberStack = new Stack<Number>();
Collection<Integer> integers=...
numberStack.pushAll(integers);

Integer extends Number, so I can add a collection of Integers to numberStack. But I was told that this is an error compilation- Why?

Pyrosis answered 31/8, 2011 at 9:7 Comment(5)
I assume that pushAll is actually defined within Stack<E>, right?Nottage
@Nir: Please choose a better question title. There are actually several other question here on SO with exactly the same title that ask a different things (actually, one of them asks almost exactly the same thing, so I vote to close as duplicate).Paralyze
possible duplicate of Generics in JavaParalyze
@Björn: while the reason and explanation is the same, the question is a different one.Nottage
@Joachim: The titles match exactly, and I believe if the OP had read that question, he might not have asked this one.Paralyze
N
12

Your code specified that it only accepts a Collection with the same type parameter as the Stack has.

You should write the pushAll method like this:

public void pushAll (Collection<? extends E> src)

This means that you expect a Collection of some type that extends E (i.e. you don't care what specific type it is, but it must be E or some sub-type of it).

Look at the definition of Collection.addAll(): it's defined in the same way.

Nottage answered 31/8, 2011 at 9:9 Comment(0)
S
1

the problem is that you have two types but only one generic representation (E) so E is Number as well as Integer. Thats confusing him. You need to have the same type for the collection. Rewrite it to

pushAll(Collection<K> src) 

and cast K to E.

Spay answered 31/8, 2011 at 9:11 Comment(0)
W
1

This problem is due the fact that collections in java are not covariant. There are numerous question on SO about it, such as this one.

Wondawonder answered 31/8, 2011 at 9:13 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.