假设以下设置:
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>
的事实对于这个问题并不重要...
答案 0 :(得分:1)
您无法阻止在编译器级别替换超类实例的子类实例,因为您尝试这样做,因为该替换是多态本身的基础。
如果参数的dynamicType
证明不是超类,那么你当然可以在运行时中自由地抛出:
func doSomething(arg: BaseClass) {
if !(arg.dynamicType === BaseClass.self) {
fatalError("die die die")
}
println("ok")
}