【问题标题】:Is it possible in Scala to specify a constraint on a generic type τ such that τ <: σ ∧ τ ≠ σ?在 Scala 中是否可以在泛型类型 τ 上指定一个约束,使得 τ <: σ ∧ τ ≠ σ?
【发布时间】:2014-07-14 14:59:04
【问题描述】:

我有一个类型:

class σ

现在我要定义一个类型:

class υ[τ <: σ]

附加要求τ≠σ。

这可能吗?

【问题讨论】:

    标签: scala generics types


    【解决方案1】:

    使用 Miles Sabin 的回答 here

    trait =!=[A, B]
    
    implicit def neq[A, B] : A =!= B = null
    implicit def neqAmbig1[A] : A =!= A = null
    implicit def neqAmbig2[A] : A =!= A = null
    

    然后:

    scala> class A
    defined class A
    
    scala> class B[C <: A](implicit ev: C =!= A)
    defined class B
    
    scala> class D extends A
    defined class D
    
    scala> new B[D]()       // OK, D is a subtype of A
    res4: B[D] = B@4d8c463c
    
    
    scala> new B[A]()       // Error, A =:= A
    <console>:15: error: ambiguous implicit values:
       both method neqAmbig1 of type [A]=> =!=[A,A]
       and method neqAmbig2 of type [A]=> =!=[A,A]
       match expected type =!=[A,A]
    
    scala> class E
    defined class E
    
    scala> new B[E]()       // Error, E is not a subtype of A
    <console>:15: error: type arguments [E] do not conform to class B's type parameter bounds [C <: A]
    

    【讨论】:

    • A =!= B 是否等于 =!=[A, B]?我们可以使用 A AnyName B 代替 AnyName[A, B] 吗?
    • @cloud 是的,A =!= B=!=[A, B] 一样;请注意,这类似于调用方法的两种语法,“操作符”语法和“普通”语法。
    • 如果能够得到比令人困惑的“模糊隐含值”更好的错误消息,那就太好了。
    猜你喜欢
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 2023-03-17
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多