在最新的playground中尝试使用泛型类型编写堆栈时出现了这个奇怪的错误。
我真的不明白这是怎么回事,有人能解释一下我为什么会犯这个错误吗?

class MyStack<T> {
    var stack1 = [T]()

    func push<T>(value: T) {
        stack1.append(value)  // Error: cannot invoke 'append' with an argument list of type '(T)'
    }
}

最佳答案

该类已经是泛型的,不需要使push也成为泛型的

class MyStack<T> {
    var stack1 = [T]()

    func push(value: T) {
        stack1.append(value)
    }
}

push声明为push<T>时,泛型参数将重写在类上定义的参数。所以,如果我们重命名泛型参数,我们将得到
class MyStack<T1> {
    var stack1 = [T1]()

    func push<T2>(value: T2) {
        stack1.append(value)  // Error: cannot invoke 'append' with an argument list of type '(T2)'
    }
}

这样呈现,我们不能在T2中推[T1],这是有意义的。

10-02 08:08