无法将“A <t>”类型的值转换为预期的参数类型“A&lt; _&gt;”

时间:2018-04-23 07:50:18

标签: swift generics

我正在试图理解我做错了什么。

我创建了一个泛型类,与bellow一样(不要注意代码的目的,只是为了显示错误)

我需要定义'+'对A类的两个实例意味着什么。不幸的是,swift抱怨

  

无法将“A”类型的值转换为预期参数类型“A&lt; _&gt;”

public static func +(lhs: A<T>, rhs: A<T>) -> A<T> {
        return A.foobar(lhs: lhs, rhs: rhs, operation: +);
    }

我不知道为什么......

以下是代码:

import Foundation

public struct A<T:Equatable&CustomStringConvertible> {

    public let uu:T

    public init(uu:T){
        self.uu = uu;
    }
}

extension A:Equatable {
    public static func ==(lhs: A<T>, rhs: A<T>) -> Bool {
        return lhs.uu == rhs.uu
    }

    public static func +(lhs: A<T>, rhs: A<T>) -> A<T> {
        return A.foobar(lhs: lhs, rhs: rhs, operation: +);
    }

    fileprivate static func foobar(lhs: A<T>, rhs: A<T>, operation: (T, T) -> T) -> A<T> {

        return A<T>(uu:lhs.uu)
    }
}

有人可以帮忙吗?

编辑: 为避免混淆,foobar可以替换为:

fileprivate static func foobar(lhs: A<T>, rhs: A<T>, operation: (T, T) -> T) -> A<T> {

    return A<T>(uu:operation(lhs.uu,rhs.uu))
}

1 个答案:

答案 0 :(得分:1)

错误消息具有误导性。真正的问题是存在 在给定限制下,没有+类型为(T, T) -> T)的运算符。

一个选项可能是限制T符合Numeric协议, 这需要加法,减法和乘法运算符:

public struct A<T:Equatable & CustomStringConvertible & Numeric> { ... }

标准整数和浮点类型符合此协议。

另请注意extension AAA<T>的任何引用 通用占位符默认为extension A: Equatable { public static func ==(lhs: A, rhs: A) -> Bool { return lhs.uu == rhs.uu } public static func +(lhs: A, rhs: A) -> A { return A.foobar(lhs: lhs, rhs: rhs, operation: +); } fileprivate static func foobar(lhs: A, rhs: A, operation: (T, T) -> T) -> A { return A(uu: operation(lhs.uu, rhs.uu)) } } ,因此您可以简化。{ 代码

YEAR (AJ) =year(AI2)+(month(AI2)>=$d$1)