[lvti] Non-denotable types
    Tagir Valeev 
    amaembo at gmail.com
       
    Fri Jul 14 05:15:48 UTC 2017
    
    
  
Hello!
When thinking about local variable type inference, I noticed that lambda
parameter type inference in Java 8 is sometimes similar. For example, we
can declare the following method:
    static <T> void var(T t, Consumer<? super T> cons) {
        cons.accept(t);
    }
Then Java 8 code like this:
   var(theValue, theVariable -> {
      codeBlock;
   });
Is equivalent to LVTI code like this:
  var theVariable = theValue;
  codeBlock;
Apparently this does not work for non-denotable types. I checked the
non-denotable types section in [1]: seems that lambda parameter inference
infers to non-denotable type as it described in this section, which already
produces "surprising" results:
    void test(List<?> l1, List<?> l2) {
        var(l1, l3 -> {
            l3 = l2; // error
            l3.add(l3.get(0)); // error
        });
    }
Shouldn't we expect a consistency here? There's already a kind of variables
in Java (lambda parameters) for which non-denotable types are inferred. It
looks strange to me that two kinds of variable inference work in different
manner.
With best regards,
Tagir Valeev
[1] http://openjdk.java.net/jeps/286
    
    
More information about the amber-dev
mailing list