package checkers.nullness;
import checkers.nullness.quals.*;
/**
* Utilities class for the Nullness Checker.
* <p>
*
* To avoid the need to write the NullnessUtils class name, do:
* <pre>import static checkers.nullness.NullnessUtils.castNonNull;</pre>
* <p>
*
* <b>Runtime Dependency</b>
* <p>
*
* Please note that using this class introduces a Runtime dependency.
* This means that if you need to distribute (or link to) the Checker
* Framework, along with your binaries.
*
* To eliminate this dependency, you can simply copy this class into your
* own project.
*/
public final class NullnessUtils {
private NullnessUtils()
{ throw new AssertionError("shouldn't be instantiated"); }
/**
* A method that suppresses warnings from the Nullness Checker.
* <p>
*
* The method takes a possibly-null reference, unsafely casts it to
* have the @NonNull type qualifier, and returns it. The Nullness
* Checker considers both the return value, and also the argument, to
* be non-null after the method call. Therefore, the
* <tt>castNonNull</tt> method can be used either as a cast expression or
* as a statement. The Nullness Checker issues no warnings in any of
* the following code:
*
* <pre>
* // one way to use as a cast:
* @NonNull String s = castNonNull(possiblyNull1);
*
* // another way to use as a cast:
* castNonNull(possiblyNull2).toString();
*
* // one way to use as a statement:
* castNonNull(possiblyNull3);
* possiblyNull3.toString();`
* </pre>
*
* The <tt>castNonNull</tt> method is intended to be used in situations
* where the programmer definitively knows that a given reference is
* not null, but the type system is unable to make this deduction. It
* is not intended for defensive programming, in which a programmer
* cannot prove that the value is not null but wishes to have an
* earlier indication if it is. See the Checker Framework manual for
* further discussion.
* <p>
*
* The method throws {@link AssertionError} if Java assertions are
* enabled and the argument is {@code null}. If the exception is ever
* thrown, then that indicates that the programmer misused the method
* by using it in a circumstance where its argument can be null.
* <p>
*
* @param ref a possibly-null reference
* @return the argument, casted to have the type qualifier @NonNull
*/
@SuppressWarnings("nullness")
@AssertParametersNonNull
public static <T extends @Nullable Object> @NonNull T castNonNull(T ref) {
assert ref != null : "misuse of castNonNull, which should never be called on a null argument";
return (@NonNull T)ref;
}
}