Type parameters are treated differently based on their names

julia> dump(Type)
UnionAll
  var: TypeVar
    name: Symbol T
    lb: Union{}
    ub: Any
  body: Type{T} <: Any

The default Type is defined using T as the type parameter symbol.

julia> dump(Type{S} where S)
UnionAll
  var: TypeVar
    name: Symbol S
    lb: Union{}
    ub: Any
  body: Type{S} <: Any

Both cases should be functionally the same , hence == holds, but since the typevar symbol is carried around they are not identical.

2 Likes