m***@heinerkuecker.de
2013-01-16 16:30:45 UTC
Hallo Javaner,
manchmal stellen mich die Generics vor Rätsel,
ich bin wahrscheinlich zu einfach gestrickt dafür.
Folgendes Beispiel:
import java.util.ArrayList;
import java.util.List;
public final class GenericsProblem
{
static class A {
}
static class AX
extends A {
}
public static void main( String[] args )
{
final List<A> aList = new ArrayList<A>();
final List<AX> axList = new ArrayList<AX>();
aList.addAll( axList );
final List<? extends A> aWildcardExtendsList = new ArrayList<A>();
//compiler error: The method addAll(Collection<? extends capture#1-of ? extends GenericsProblem.A>) in the type List<capture#1-of ? extends GenericsProblem.A> is not applicable for the arguments (List<GenericsProblem.AX>)
aWildcardExtendsList.addAll( axList );
final List<? super A> aWildcardSuperList = new ArrayList<A>();
aWildcardSuperList.addAll( axList );
}
}
Beim ersten addAll ist der Compiler zufrieden, obwohl ich die Liste ohne Wildcards, also invariant deklariert habe.
Also das dürfte nach meiner Meinung nicht kompilieren.
Beim zweiten addAll habe ich die Liste mit einem extends-Wildcard versehen,
also kovariant deklariert.
Da kompiliert es nicht, der angegebene Fehler taucht auf.
Eventuell liegt es ja an der addAll-Methode von List, denn diese setzt noch einen Wildcard drauf
public interface List<E> extends Collection<E> {
boolean addAll(Collection<? extends E> c);
Die dritte addAll-Variante ist wiederum erlaubt.
Könnt Ihr mir das erklären?
Danke
Heiner
manchmal stellen mich die Generics vor Rätsel,
ich bin wahrscheinlich zu einfach gestrickt dafür.
Folgendes Beispiel:
import java.util.ArrayList;
import java.util.List;
public final class GenericsProblem
{
static class A {
}
static class AX
extends A {
}
public static void main( String[] args )
{
final List<A> aList = new ArrayList<A>();
final List<AX> axList = new ArrayList<AX>();
aList.addAll( axList );
final List<? extends A> aWildcardExtendsList = new ArrayList<A>();
//compiler error: The method addAll(Collection<? extends capture#1-of ? extends GenericsProblem.A>) in the type List<capture#1-of ? extends GenericsProblem.A> is not applicable for the arguments (List<GenericsProblem.AX>)
aWildcardExtendsList.addAll( axList );
final List<? super A> aWildcardSuperList = new ArrayList<A>();
aWildcardSuperList.addAll( axList );
}
}
Beim ersten addAll ist der Compiler zufrieden, obwohl ich die Liste ohne Wildcards, also invariant deklariert habe.
Also das dürfte nach meiner Meinung nicht kompilieren.
Beim zweiten addAll habe ich die Liste mit einem extends-Wildcard versehen,
also kovariant deklariert.
Da kompiliert es nicht, der angegebene Fehler taucht auf.
Eventuell liegt es ja an der addAll-Methode von List, denn diese setzt noch einen Wildcard drauf
public interface List<E> extends Collection<E> {
boolean addAll(Collection<? extends E> c);
Die dritte addAll-Variante ist wiederum erlaubt.
Könnt Ihr mir das erklären?
Danke
Heiner