2016-08-04 6 views
6

Ich habe den folgenden Code, der auf Java 8 gut funktioniert:Java Wildcard Unterschied in 7 und 8

List<Class<?>> KEY_NAME_CLASSES = Collections.singletonList(String.class); 

Aber wenn ich versuche, die Java 7-Compiler zu verwenden, erhalte ich eine Fehlermeldung:

incompatible types: java.util.List<java.lang.Class<java.lang.String>> cannot be converted to java.util.List<java.lang.Class<?>> 

Warum? Gibt es eine Möglichkeit, solche Platzhalter in Java 7 zu verwenden?

Antwort

10

Typinferenz unterscheidet sich erheblich in Java-7 und Java-8. Kurz gesagt, verwendet Java-7 zur Bestimmung des Ausdruckstyps nur den Ausdruck selbst, während Java-8 den umgebenden Kontext verwenden kann. Daher ist der Typ des Ausdrucks Collections.singletonList(String.class) in Java-7 der genaueste Typ, der aus diesem Ausdruck bestimmt werden könnte, nämlich List<Class<String>>. Java-8 ist schlauer: Es sieht auch so aus, als ob dieser Ausdruck einem anderen kompatiblen Typ List<Class<?>> zugeordnet ist, also setzt er auch den Typ Collections.singletonList(String.class) auf List<Class<?>>.

in der Arbeit, um diesen Code zu machen Java-7 sollten Sie den generischen Typen explizit angeben:

List<Class<?>> KEY_NAME_CLASSES = Collections.<Class<?>>singletonList(String.class);