Java 8 and Generalized Target-Type Inference

后端 未结 2 2046
慢半拍i
慢半拍i 2020-12-10 01:29

I have installed the last JDK 8 ea b114 to test the new language features. However the inference in chained calls seems not to work yet.

If I write:

         


        
相关标签:
2条回答
  • 2020-12-10 02:12

    The latest specification (Public Review) is available at jcp.org. There is a paragraph in part D which discusses this point.

    The receiver in a method invocation, field access, etc. (exp.foo()) is not a poly expression because the target type is unknown—it would be impossible to enumerate every type that has a particular member (foo, in this case). There has been some interest in allowing inference to "chain": in a().b(), passing type information from the invocation of b to the invocation of a. This adds another dimension to the complexity of the inference algorithm, as partial information has to pass in both directions; it only works when the erasure of the return type of a() is fixed for all instantiations (e.g. List). This feature would not fit very well into the poly expression model, since the target type cannot be easily derived.

    0 讨论(0)
  • 2020-12-10 02:18

    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.

    0 讨论(0)
提交回复
热议问题