Skip to content

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

@t-rasmud

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

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