question about JDK-8063054 (incorrect raw type warnings for method references)

B. Blaser bsrbnd at gmail.com
Fri Mar 24 15:56:18 UTC 2017


Hi Maurizio,

On 23 March 2017 at 12:58, Maurizio Cimadamore
<maurizio.cimadamore at oracle.com> wrote:
> Hi Bernard,
>
> [...]
>
> I think the lines in bold are the ones we need to pay attention to; in other
> words, if the receiver type is raw and the type of the first search is
> identical to the type of the second search, then it means no inference
> occurred. I think something like this could easily be achieved w/o any
> visitors, with something like this:
>
>                 if (that.getMode() == ReferenceMode.INVOKE &&
>                         TreeInfo.isStaticSelector(that.expr, names) &&
>                         that.kind.isUnbound() &&
>                         types.isSameTypes(lookupHelper.site, that.expr.type)
> {
>                     chk.checkRaw(that.expr, localEnv);
>                 }
>
> I did some quick tests and this simple patch seems to remove the undesired
> warnings in the examples we have seen so far, but retains them where they
> are truly deserved. What do you think?
>
> Maurizio

Fine, nice solution... I would simply rewrite it as follows (
lookupHelper.site.isRaw() ):

                if (that.getMode() == ReferenceMode.INVOKE &&
                        TreeInfo.isStaticSelector(that.expr, names) &&
                        that.kind.isUnbound() &&
                        lookupHelper.site.isRaw()) {
                    chk.checkRaw(that.expr, localEnv);
                }

This would avoid some redundant checks if "ReferenceType" isn't raw (I
think), for example:

class Test10 {
    interface Consumer<T> { void accept(T arg); }
    interface Parent<P> { void foo(); }
    interface Child extends Parent<String> {}
    static <T> void m(T arg, Consumer<T> f) {}
    public void test(Child c) { m(c, Parent<String>::foo); }
}

Here, "types.isSameType(lookupHelper.site, that.expr.type)" would
verify if "Parent<String> == Parent<String>" and then "chk.checkRaw()"
would check if "Parent<String>" is raw...

But, at first sight, this looks good. I'll try to do some more testing...

What do you think of this small rewriting?

Bernard


More information about the compiler-dev mailing list