class Hoge<T: Equatable>: Equatable {
    let e: T

    init(e: T) {
        self.e = e
    }

    static func == (lhs: Hoge<T>, rhs: Hoge<T>) -> Bool {
        return lhs.e == rhs.e
    }
}

class HogeA: Hoge<Int> {}
class HogeB: Hoge<String> {}

class Foo<T: Equatable, U: Hoge<T>>: Equatable {
    var ee: U

    init(ee: U) {
        self.ee = ee
    }

    static func == (lhs: Foo<T, U>, rhs: Foo<T, U>) -> Bool {
        return lhs.ee == rhs.ee
    }
}

class FooA: Foo<Int, HogeA> {}
class FooB: Foo<String, HogeB> {}

let fooA1 = FooA(ee: HogeA(e: 1))
let fooA2 = FooA(ee: HogeA(e: 2))

let fooB1 = FooB(ee: HogeB(e: "あ"))
let fooB2 = FooB(ee: HogeB(e: "あ"))

print(fooA1 == fooA2)
print(fooB1 == fooB2)

上記のコードにおいて

class Foo<T: Equatable, U: Hoge<T>>: Equatable {
   ...
}

class FooA: Foo<Int, HogeA> {}
class FooB: Foo<String, HogeB> {}

の部分が、特殊化の引数を2つ取って冗長です。

本当は

class Foo<U: Hoge<T: Equatable>>: Equatable { // 文法エラー
    ...
}

class FooA: Foo<HogeA> {}
class FooB: Foo<HogeB> {}

としたいのですが、Fooの定義をうまく書けません(文法エラー)。
なにかうまい書き方はSwiftに用意されていますか?