无法将类型'Type <u>'的值转换为预期的参数类型'Type <_>'

时间:2019-05-04 22:04:38

标签: swift generics

我正在尝试使用静态方法作为工厂方法。原因是我有两个类以不同的方式实现算法。一种非常简单,我可以依靠它来获得有效的结果,另一种性能更高,但是更加复杂,因此,我使用简单的一种来验证对快速一种和生产中的快速一种的更改。

快速方法在初始化时比较挑剔,因此我尝试在其中创建一个静态方法,如果参数受到适当限制,该方法仅返回快速方法的一个实例。否则,它将返回该类的基本版本-请考虑ImplementationForWhenParameterIsEmptyImplementationForWhenParameterTotalIsZero

如图所示实施时,在工厂方法中出现以下错误:

  

无法将类型为'ParameterWithCommonGeneric '的值转换为   预期参数类型'ParameterWithCommonGeneric <_>'

为简单起见,在示例中,我从工厂方法中省略了基本类,只是返回了具有“快速”实现的类实例。该错误仍然存​​在。

如果将泛型从工厂方法中删除并放在扩展签名中,或者该方法未实现为静态方法,则错误消失。我想做前者,但是这使我感到怀疑。它只是简单地重新声明了类签名中的通用约束,因此似乎不应该有所作为。

工厂方法在示例的底部。

protocol CommonProtocolForClasses { associatedtype AAssociatedType: CommonProtocolForGenerics }
protocol CommonProtocolForGenerics {}

class ClassA<T: CommonProtocolForGenerics>: CommonProtocolForClasses {

    typealias AAssociatedType = T

    init(_ param: ParameterWithCommonGeneric<T>) {}
}

class ParameterWithCommonGeneric<T: CommonProtocolForGenerics> {}

class ClassWrapper<T: CommonProtocolForGenerics>: CommonProtocolForClasses {

    typealias AAssociatedType = T

    init<C: CommonProtocolForClasses>(_ adopterOfCommonProtocolForClasses: C) {}
}

extension CommonProtocolForClasses {

    internal var wrapped: ClassWrapper<AAssociatedType> { return ClassWrapper(self) }
}

extension ClassA {

    static func with<U: CommonProtocolForGenerics>(_ param: ParameterWithCommonGeneric<U>) -> ClassWrapper<U> {

        return ClassA(param).wrapped  // ERROR IS HERE
    }
}

func with<U: CommonProtocolForGenerics>(_ param: ParameterWithCommonGeneric<U>) -> ClassWrapper<U> {

    return ClassA(param).wrapped  // NO ERROR
}

extension ClassA where T: CommonProtocolForGenerics {

    static func with(_ param: ParameterWithCommonGeneric<T>) -> ClassWrapper<T> {

        return ClassA(param).wrapped  // NO ERROR
    }
}

0 个答案:

没有答案