在子类中覆盖返回协变类型的下标

Overriding a subscript returning a covariant type in subclasses

我有一个名为 LLLinkedList 的 class,它定义了一个 subscript:

class LLLinkedList<L> {
    //other properties, functions and initializers...

    subscript(range: Range<Int>) -> LLLinkedList {
        get {
            //return something 
        }
        set {
            //set something
        }
    }
}

现在 subscript 显然需要一个 Range<Int> 和 return 一个 LLLinkedList.

我还定义了 LLLinkedList 的一个子 class,名为 LLArray:

class LLArray<A>: LLLinkedList<A> {
    //other properties, functions and initializers...
}

LLArray 还实现了一个 subscript 接受一个 Range<Int> 和 return 一个 LLArray:

subscript(range: Range<Int>) -> LLArray {
    get {
        //return something
    }
    set {
        //set something
    }
}

由于 LLArrayLLLinkedList 的一种类型,因此无法 覆盖 子 class 中的 subscript(因为参数和 return 类型因此是相同的)。
如果我不覆盖下标,编译器就会对我大喊大叫:

<stdin>:1173:5: error: cannot override mutable subscript of type '(Range<Int>) -> LLArray<A>' with covariant type '(Range<Int>) -> LLLinkedList<A>'
subscript (range: Range<Int>) -> LLArray {
^

现在这个错误对我来说很有意义,但我该如何绕过它呢?
或者我什至必须实施新的 subscript? 我实施了一个新的 subscript,因此 LLArray 被 return 取代了 LLLinkedList,从而避免了在使用 [=49 时需要向下转换=]ed实例。

基本上,没有办法用read/write下标做你想做的事情,因为return类型的下标实际上出现在[=10的协变和逆变位置=] class(下标的get部分放在协变位置;set部分放在逆变位置)。因此它不能在 subclasses 中改变,因为它会破坏替换原则。再多的协议和扩展也无法修复它(如果修复了,那就是编译器错误)。

这里的一种可能性是将下标拆分为两种方法:getter 方法可以具有协变的 return 类型,而 setter 仍然始终接受更通用的 LLLinkedList类型。