|
Yes, it's all about nulls.
I was curious to break it down from Curry-Howard correspondence (Types as Propositions) point of view. The line static class Constrain<A, B extends A> {}
reads as for all propositions A and B, such that B implies A, proposition Constrain<A, B> holds.
While, the line: Constrain<U,? super T> constrain = null;
kind of says: Admit that there exists type X, such that T implies X, for which Constrain<U, X> holds.
Even though no proof (read constructed instance) that X implies U is provided.If we look at concrete execution instance with String and Integer: String implies Object, Serializable, Comparable<String>, CharSequence. None of those imply/extend Integer, which is required for truthful Constrain<U, ? super T> proposition. Basically, ex falso quodlibet :) EDIT: spacing, formatting, wording. |