blob: 1599464f6ac3f59d9aa9987b6c82d8e6fc81c023 [file] [log] [blame]
package org.checkerframework.framework.qual;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* A marker annotation, written on a class declaration, that signifies that one or more of the
* class's type parameters can be treated covariantly. For example, if {@code MyClass} has a single
* type parameter that is treated covariantly, and if {@code B} is a subtype of {@code A}, then
* {@code SomeClass<B>} is a subtype of {@code SomeClass<A>}.
*
* <p>Ordinarily, Java treats type parameters invariantly: {@code SomeClass<B>} is unrelated to
* (neither a subtype nor a supertype of) {@code SomeClass<A>}.
*
* <p>It is only safe to mark a type parameter as covariant if clients use the type parameter in a
* read-only way: clients read values of that type but never modify them.
*
* <p>This property is not checked; the {@code @Covariant} is simply trusted.
*
* <p>Here is an example use:
*
* <pre>{@code @Covariant(0)
* public interface Iterator<E extends @Nullable Object> { ... }
* }</pre>
*
* @checker_framework.manual #covariant-type-parameters Covariant type parameters
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface Covariant {
/** The zero-based indices of the type parameters that should be treated covariantly. */
int[] value();
}