在通用实现中无法将[Int]转换为[Int]

Mor*_*iya 4 generics swift swift2

试图创建一个通用数据源我遇到了这个错误,我想知道为什么这是不可编译的.

错误:

无法将类型为'[Int]'的返回表达式转换为返回类型'[Int]'

代码:

protocol DataSource {
    func getData<T> () -> [T]
}

class IntDataSource<Int>: DataSource {
    let data:[Int] = []
    func getData<Int>() -> [Int] {
        return data
    }
}
Run Code Online (Sandbox Code Playgroud)

在IntDataSource中的return语句上抛出错误.

我知道这可以通过更好的方式完成

typealias DataType
var data: DataType? { get }
Run Code Online (Sandbox Code Playgroud)

但我主要感兴趣的是为什么编译器不想接受return语句.有任何想法吗?

编辑:

问题的一部分也是为什么如果以前的代码不可编译是下面的公平游戏?

class IntDataSource<Int>: DataSource {
    func getData<Int>() -> [Int] {
        let data:[Int] = []
        return data
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑2:

这个版本也编译没有问题

class IntDataSource<Int>: DataSource {

    func getData<Int>() -> [Int] {
        return getIntData()
    }

    func getIntData<Int>() -> [Int] {
        let data:[Int] = []
        return data
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 6

"奇怪的"编译器错误

Cannot convert return expression of type '[Int]' to return type '[Int]'
Run Code Online (Sandbox Code Playgroud)

可以解释如下:

无论是<Int>在你的类定义和<Int> 在方法定义中引入一个新的名为泛型类型的占位符Int(因此外<Int>隐藏全局类型具有相同的名称,以及内<Int>隐藏外一个).你的类定义相当于

class IntDataSource<A>: DataSource {
    let data:[A] = []
    func getData<B>() -> [B] {
        return data 
    }
}
Run Code Online (Sandbox Code Playgroud)

现在编译错误是可以理解的:

cannot convert return expression of type '[A]' to return type '[B]'
Run Code Online (Sandbox Code Playgroud)