As @Holger said, Java 8 improved contextual inference so that this works_
public static <T> Iterator<T> iter(Iterable<T> i) { return i.iterator(); } public static void main(String[] args) { Iterator<String> it = iter( new ArrayList<>() ); \____________________________/ }
It didn't work in Java 7 — the inference on new ArrayList<>() could not depend on context.
It'll be a huge change to the language to do what you want in the question. John Rose started a similar discussion, see http://mail.openjdk.java.net/pipermail/lambda-dev/2013-July/010531.html
Too much inference and too much contextual dependency can be a bad thing. It's not so much that the compiler cannot handle the complexity - it can. It's about whether human programmers can handle it. I am sensing that Java 8 is already at a dangerous level that the codes will be difficult for humans to parse.