2017-12-19 10 views
0

folgenden Code produzieren Fehler zu Arraylist:inkompatible Typen: Arraylist <C<CAP#1>> kann nicht konvertiert werden <C<?>>

class A { 
    public static class C<T> { 
     public ArrayList<C<T>> lst; 
    } 

    public void main(String[] args) { 
     C<?> o = new C<>(); 
     ArrayList<C<?>> l = o.lst; 
    } 
} 

Fehlermeldung:

a.java:10: error: incompatible types: ArrayList<C<CAP#1>> cannot be converted to ArrayList<C<?>> 
     ArrayList<C<?>> l = o.lst; 
          ^
    where CAP#1 is a fresh type-variable: 
    CAP#1 extends Object from capture of ? 

Er sagt, dass Typen unterschiedlich sind, aber wenn ich ersetzen? für T in dann wird es ArrayList<C<T>> selbe wie Art der Liste l.

Was ist los mit meiner Argumentation?

Antwort

1

Der Compiler akzeptiert die Zuweisung einer Sammlung mit einem Untertyp des generischen Objekts nur dann an eine generische Auflistung, wenn das variable Ziel der Zuweisung das Hinzufügen von Elementen in der Auflistung nicht zulässt.
Dies schützt generische Auflistungen vor dem Hinzufügen, die nicht mit dem vom Untertyp der Auflistung deklarierten Typ übereinstimmen.

Ihr Problem ist, dass l auf diese Weise, indem er erklärt:

ArrayList<C<?>> l 

Sie in jeder C Instanz hinzufügen können:

l.add(new C<String>()); 
l.add(new C<Integer>()); 

von o.lst-l zuweisen, könnten Sie so addieren etwas in o.lst was auch immer es erklärt generisch ist.

so dass der Compiler nicht akzeptiert diese Zuordnung:

ArrayList<C<?>> l = o.lst; 

Wenn jetzt schreiben Sie:

ArrayList<?> l = o.lst; 

wird es in Ordnung sein, wie l keine Zugabe aber null nicht gestattet.

Verwandte Themen