google / error-prone

Catch common Java mistakes as compile-time errors
https://errorprone.info
Apache License 2.0
6.83k stars 742 forks source link

Varifier false positive when the functional interface is inferred by the generic type #4578

Open ben-manes opened 2 weeks ago

ben-manes commented 2 weeks ago
AbstractTraceReader.java:72: warning: [Varifier] Consider using > `var` here to avoid boilerplate.

       List<UnaryOperator<InputStream>> extractors = List.of(
                                        ^
     (see https://errorprone.info/bugpattern/Varifier)
   Did you mean 'var extractors = List.of('?

This suggestion is not feasible because inferring to the functional interface must be done explicitly.

List<UnaryOperator<InputStream>> extractors = List.of(
    in -> tryXz(in), in -> tryCompressed(in), this::tryArchived);

To satisfy this check requires using a type witness. If that was intended then the suggestion should rewrite it correctly, e.g.

var extractors = List.<UnaryOperator<InputStream>>of(
    in -> tryXz(in), in -> tryCompressed(in), this::tryArchived);

Another related case is the inference from the cache builder, where the generic type has to be added to the lambda parameter to comply with this suggestion.

warning: [Varifier] Consider using `var` here to avoid boilerplate.
    LoadingCache<Integer, Integer> cache = Caffeine.newBuilder().build(k -> -k);