无法推断通用参数T。工厂方法

Diegomontoyas

有人可以向我解释为什么这行不通吗?

我有一个带有工厂方法的类,如下所示:

public class NetworkTask<T> {

    var request: URLRequest

    var completionHandler: NetworkResponse<T> -> Void

    init(request: URLRequest, completionHandler: NetworkResponse<T> -> Void) {

        self.request = request
        self.completionHandler = completionHandler
    }

    static func dataResponseTaskWithRequest(request: URLRequest, completionHandler: NetworkResponse<NSData> -> Void) -> NetworkTask<NSData> {

        return NetworkTask<NSData>(request: request, completionHandler: completionHandler)
    }

    static func mappedObjectResponseTaskWithRequest<MappedType>(request: URLRequest, completionHandler: NetworkResponse<MappedType> -> Void) -> NetworkTask<MappedType> {

        return NetworkTask<MappedType>(request: request, completionHandler: completionHandler)
    }
}

然后,在高兴地知道它可以编译之后,我去创建一个像这样的Task:

let task = NetworkTask.dataResponseTaskWithRequest(URLRequest()) { (response) in

    }

不...

无法推断出通用参数T

等一下,我可以清楚地推断出它,该方法返回NetworkTask<NSData>,所以T为NSData。

好吧...那么,也许是这样吗?

let task: NetworkTask<NSData> = NetworkTask.dataResponseTaskWithRequest(URLRequest()) { (response) in

}

不...

无法使用类型为((URLRequest,(_)-> _))的参数列表调用'dataResponseTaskWithRequest'

好的,所以也许是另一种方法:

let task = NetworkTask.mappedObjectResponseTaskWithRequest(URLRequest()) { (response: NetworkResponse<String>) in

}

不...

无法将类型'(NetworkResponse)->()'的值转换为预期的参数类型'NetworkResponse <_>->无效'

我在这里肯定会丢失一些东西,因为编译器不会有太多错误。有人有任何线索吗?

mz2

NetworkTask<T>是类型,不是NetworkTask也就是说,该参数T位于类上,并且您对该类所做的所有操作以及访问其类方法的操作都需要描述该类型。

即使T不会给您带来编译器错误的方法声明中包含,也没有类NetworkTask可以包含所有不包含类型参数的类方法-可以设想该方法在所有类上都NetworkTask<T>具有的任何值T这类似于C ++,在C ++中,相应的甚至被称为“模板”,这意味着带有泛型类型参数的类声明将用作模板,从字面上编译不同的类。例如,这与Java有所不同,在Java中,泛型语法只是带有类型擦除的编译时糖(您确实可以在其中调用class方法-在这种情况下,仅存在一个类)。

这是一个演示更多示例的最小示例:

class A<T> {
    class func foo() {
    }

    class func bar(t:T) -> Void {
    }
}

class B {}

A.foo() // this gives an error because the type cannot be inferred.

A.bar(1) // this works fine without compiler errors as the integer literal type can be inferred there.

在上面的示例情况下,例如可以使用以下命令调用A:

A<IntegerLiteralType>.foo()

您可能应该考虑这种情况下的方法是否属于具有该类型参数的类T,或者它们是否应具有其他内容作为接收者(或者实际上它们是否应为自由函数?)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法推断出通用参数T。工厂方法

来自分类Dev

通用工厂方法和类型推断

来自分类Dev

无法推断通用参数“ T”

来自分类Dev

重载方法时出现“无法推断通用参数'T'”错误

来自分类Dev

重载方法时出现“无法推断通用参数'T'”错误

来自分类Dev

无法推断通用参数“ T”的参数

来自分类Dev

Swift通用参数“ T”无法推断

来自分类Dev

分配后无法推断通用参数“ T”

来自分类Dev

Swift:无法推断通用参数“T”

来自分类Dev

返回通用实例的工厂方法

来自分类Dev

模拟通用存储库工厂方法

来自分类Dev

通用网络服务方法中无法推断通用参数“ T”

来自分类Dev

无法使用可选的通用数组推断通用参数 T

来自分类Dev

无法推断通用参数的参数

来自分类Dev

如果使用工厂方法,为什么TypeToken无法捕获通用类型?

来自分类Dev

如果使用工厂方法,为什么TypeToken无法捕获通用类型?

来自分类Dev

无法推断通用参数“父母”

来自分类Dev

无法推断通用参数'Element'

来自分类Dev

无法推断通用参数“实体”

来自分类Dev

无法用闭包推断通用参数“ T”

来自分类Dev

带有工厂方法和参数的Spring静态工厂

来自分类Dev

如何快速编写通用工厂方法?

来自分类Dev

如何快速编写通用工厂方法?

来自分类Dev

Java帮助使用通用类阐明工厂方法

来自分类Dev

通用方法无法推断类型

来自分类Dev

从参数动态推断通用方法的类型参数

来自分类Dev

SwiftUI UIViewRepresentable中的“无法推断通用参数”

来自分类Dev

无法推断通用类的类型参数

来自分类Dev

Swift:无法推断出通用参数