将函数参数参数限制为Swift中的基类

时间:2015-04-24 17:14:04

标签: swift generics subclass base-class

假设以下设置:

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) { }

希望我不只是让所有人更加困惑,但“中缀运算符”部分以及BaseClass是通用BaseClass<T>的事实对于这个问题并不重要...

1 个答案:

答案 0 :(得分:1)

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

如果参数的dynamicType证明不是超类,那么你当然可以在运行时中自由地抛出

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