Java 8 Incompatible Types -
here's simple code
import java.util.arraylist; import java.util.collections; import java.util.hashmap; import java.util.map;  public class simpletest {      public static void main(string[] args) {     final arraylist<map<string, object>> maps = newarraylist(         createmap("1", "a", collections.empty_map, collections.empty_map),         createmap("2", "b", collections.empty_map, collections.empty_map),         createmap("3", "c", collections.empty_map, collections.empty_map)     );       system.out.println(" maps = " + maps);     }      public static map<string, object> createmap(string value1, string value2, map<string, object> object1, map<string, object> object2) {        map<string, object> map = new hashmap<>();        map.put("value1", value1);        map.put("value1", value1);        map.put("object1", object1);        map.put("object2", object2);        return map;     }          public static <e> arraylist<e> newarraylist(e... elements) {     arraylist<e> list = new arraylist<e>(elements.length);     collections.addall(list, elements);     return list;     } } when java_home points jdk 8 , use javac -source 1.7 simpletest.java 
simpletest.java:9: error: incompatible types: arraylist<map> cannot converted arraylist<map<string,object>>         final arraylist<map<string, object>> maps = newarraylist(                                                                 ^ when use -source 1.8 or no -source option works ok. now, when java_home points jdk 7 code compiles whether use -source 1.7 or not. 
initially question piece of software pom file has <source> , <target> set 1.7 , build failing on jdk 8 ok on jdk 7. 
now question - causes happen ? seems me major overlook of sort. why compiling on jdk 8 source set 1.7 fails ? 
you can simplify code self-contained example doesn’t need 3rd-party libraries:
public class test2 {     @safevarargs     static <t> arraylist<t> newarraylist(t... arg) {         return new arraylist<t>(arrays.aslist(arg));     }     private final list<map<string, object>> maps = newarraylist(         createmap(null, collections.empty_map)      );      public static map<string, object> createmap(string id, map<string,string> m) {         return null;     } } this can compiled using javac jdk1.7, not javac jdk1.8 using -source 1.7.
the point here javac jdk1.8 still different compiler 1 included in previous version , option -source 1.7 doesn’t tell mimic old implementation’s behavior compatible java 7 specification. if old compiler has bug, newer compiler doesn’t have try reproduce bug.
since code uses collections.empty_map rather collections.<string,string>emptymap(), raw type map passed createmap, making unchecked invocation having raw result type map.
this mandated jls §15.12.2.6:
the result type of chosen method determined follows:
if chosen method declared return type of void, result void.
otherwise, if unchecked conversion necessary method applicable, result type erasure (§4.6) of method's declared return type.
…
it seems behavior has not been (fully) implemented in javac of jdk1.7. interestingly, correctly when adding type parameter like
public static <t> map<string, object> createmap(string id, map<string,string> m) making generic method. then, jdk1.7 produce same error. cited rule applies all method invocations.
in contrast, fact compiling java 8 compliance succeeds stems new target type inference, has entirely different rules.
Comments
Post a Comment