2016-08-04 27 views
6

我有下面的代碼,它基於Java 8正常工作:的Java通配符差異和8

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

但是當我嘗試使用Java 7的編譯器,我得到一個錯誤:

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

爲什麼?有沒有什麼方法可以在Java 7中使用這種通配符?

回答

10

類型推斷在Java-7和Java-8中有很大不同。簡而言之,要確定表達式類型,Java-7只使用表達式本身,而Java-8可以使用周圍的上下文。所以Java-7中表達式Collections.singletonList(String.class)的類型是可以從這個表達式確定的最精確的類型,即List<Class<String>>。 Java-8更聰明:它也看起來這個表達式被分配給另一個兼容類型List<Class<?>>,所以它也將Collections.singletonList(String.class)的類型設置爲List<Class<?>>

爲了使這個代碼使用的Java-7應指定泛型類型明確:

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