代码之家  ›  专栏  ›  技术社区  ›  Mark A. Donohoe

您能强制使用两种类型的泛型以确保这些类型不相同吗?

  •  0
  • Mark A. Donohoe  · 技术社区  · 4 年前

    这是我想做的(但它不会编译)。。。

    class Foo<T1, T2> where T1 != T2 {
    }
    

    考虑到这些类型。。。

    class A{}
    class B{}
    class SubA : A{}
    

    这些应该是有效的。。。

    let w = Foo<A, B>()
    let x = Foo<B, A>()
    

    let y = Foo<A, SubA>
    

    但这不应该被允许。。。

    let y = Foo<A, A>
    

    如果重要的话使用Swift 5。

    0 回复  |  直到 4 年前
        1
  •  0
  •   Asperi    4 年前

    这是一种可能的方法,编译时为相同类型生成错误,为不同类型传递错误。

    generics type checking to avoid same types

    class A {}
    class B {}
    
    class Foo<T1, T2> {
        private init() {}
    }
    
    extension Foo where T1: A, T2: B {
        convenience init(_ a: T1, _ b: T2) {
            self.init()
        }
    }
    
    extension Foo where T1: B, T2: A {
        convenience init(_ b: T1, _ a: T2) {
            self.init()
        }
    }
    

    以及测试。。。

    let test1 = Foo(A(), B())
    let test2 = Foo(B(), A())
    let test2 = Foo(A(), A()) // << Error: Ambiguous reference to initializer 'init(_:_:)'
    let test2 = Foo(B(), B()) // << Error: Ambiguous reference to initializer 'init(_:_:)'
    let test3 = Foo<String, String>() // Error: 'Foo<T1, T2>' initializer is inaccessible due to 'private' protection level
    

    更新:Rob Napier评论

    enter image description here