将函数参数参数限制为基数 class in Swift

Limit function parameter argument to base class in Swift

假设以下设置:

class BaseClass<T> { }

class SubClass<T>: BaseClass<T> { }

infix operator >-- { associativity left }

func >-- <T>(lhs: BaseClass<T>, rhs: SubClass<T>) {
    // do something here
}

我正在寻找的是一种排除 SubClass 被用作运算符 >--lhs 参数的方法。这将是对通用参数的一种否定类型约束 - 即 T: BaseClass where T != Subclass:

func >-- <T, B: BaseClass<T> where B != SubClass<T>>(lhs: B, rhs: SubClass<T>)

但似乎没有 != 参数可以作为泛型的否定类型约束提供。有办法吗?

谢谢!

编辑:

我想我实际上可以让问题变得不那么复杂 - 我认为以下设置得到了完全相同的问题,但没有一些分散注意力的细节:

class BaseClass { }
class SubClass: BaseClass { }

// This is what I want to be able to do, but don't know how
// or if it is possible:
func doSomething<B: BaseClass where B != SubClass>(arg: B) { }

希望我没有让大家更加困惑,但是 "infix operator" 部分和 BaseClass 是通用 BaseClass<T> 这一事实对于这个问题来说并不重要。 .

您无法阻止在 编译器 级别用子类实例替换超类实例,正如您正在尝试做的那样,因为该替换是 基础 多态性本身。

当然,如果参数的 dynamicType 不是超类,您当然可以在运行时 随意抛出一个摇摆不定的

func doSomething(arg: BaseClass) {
    if !(arg.dynamicType === BaseClass.self) {
        fatalError("die die die")
    }
    println("ok")
}