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