On Tuesday, 21 November 2017 at 18:00:37 UTC, Meta wrote:
I don't quite understand the logic here, because it seems to be backwards reasoning. Constrain<U,? super T> is a valid type because null inhabits it? That doesn't make sense to me. He also cites the "implicit constraint" that X extends U where X is ? super T, but X does not meet that constraint (Constrain<U, X extends U>) so how can the type checker deduce that X extends U?

I haven't dug into the details of the paper as I think the authors didn't try to appear neutral, e.g. quoting null as the billon dollar mistake, and made their finding seem more spectacular than it is… What I get from skimming over it is this:

You get a call:

    upcast(constrain,x) -> String

   where:
       constrain is of type Constrain<String, X>
       x is of type X  (X is unspecified supertype of Integer)
       return type is String, which has X as subclass

   So you get String <: X <: Integer

The deduction that String is a superclass of Integer could come from:
    Constrain<String, X>

where X = ? super Integer = unknown type that is supertype of Integer





Reply via email to