Skip to content

Polymorphic types not resolved correctly in classes that implement Comparator. #219

Description

@t-rasmud

Consider the following test case:

import java.util.Comparator;
import org.checkerframework.checker.determinism.qual.PolyDet;

public class ComparatorIssue {
    public static void test(
            @PolyDet Class<?> @PolyDet [] result, @PolyDet MyComparator classComparator) {
        sortProxy(result, classComparator);
    }

    private static class MyComparator implements Comparator<Class<?>> {

        @Override
        public int compare(Class<?> c1, Class<?> c2) {
            return c1.getName().compareTo(c2.getName());
        }
    }

    public static <T> void sortProxy(T @PolyDet [] a, @PolyDet("use") Comparator<? super T> c) {}
}

Running the command javac -processor determinism checker/tests/determinism/ComparatorIssue.java -AusePolyDefault
results in the following unexpected error:

checker/tests/determinism/ComparatorIssue.java:8: error: [argument.type.incompatible] incompatible argument for parameter c of sortProxy.
        sortProxy(result, classComparator);
                          ^
  found   : @PolyDet MyComparator
  required: @PolyDet Comparator<? extends @NonDet Object super @PolyDet Class<? extends @NonDet Object>>
checker/tests/determinism/ComparatorIssue.java:8: error: [argument.type.incompatible] incompatible argument for parameter c of sortProxy.
        sortProxy(result, classComparator);
                          ^
  found   : @PolyDet MyComparator
  required: @PolyDet Comparator<? extends @NonDet Object super @PolyDet Class<? extends @NonDet Object>>
2 errors

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions