当T<:Type 左侧使用的类型是抽象类型时,声明为T 类型的函数参数将接受属于该抽象的所有事物,包括事物属于从属(继承)抽象。
对于大多数目的,这些东西是具体类型的实现,类型的实例化。一个具体类型可能有一个抽象类型作为它的超类型,而这个抽象类型可能有另一个更抽象的类型作为它的超类型,等等。 Any 是最超超类型,是抽象类型树的根。
在示例中
function foo{T<:Type}(bar::T, arg::T) ... end
在每次调用 foo 时,T 恰好采用 Type 的子类型之一或保持 Type 本身。这就是为什么bar 和arg 必须共享相同的特定类型才能匹配和调用此版本的foo。它解释了为什么下一个示例匹配并被调用
function foo{T<:Type, U<:Type}(bar::T, arg::U) ... end
当foo 和bar 都是Type 的子类型但都是两种不同具体类型的实现(例如Int32 和Int64 共享抽象超类型Integer)。
对于使用您打算接受不同类型事物的参数,没有通用的简写;不同种类共享一个公共抽象类型是有用的信息,并且允许您定义调用foo 的第一种和第二种方法。这种管理算法规范的灵活方式通常可以简化实现。这就是 Julia 的多分派提供的一些优势。
在某些情况下,使用typealias 可以简化函数签名的编写。 typealias 可以很好地使用共享超类型的非重叠子类型集合来选择性地调度。
typealias FastInt Union{ Int32, Int64 } # division is fast
typealias SlowInt Union{ Int8, Int128 } # slightly slower
foo{T<:Integer}(a::T, b::T) ... end; # default/fallback
foo{T<:FastInt}(a::T, b::T) ... end; # specialized for fast types
foo{T<:SlowInt}(a::T, b::T) ... end; # specialized for slow types
```