【问题标题】:type arguments [W] do not conform to trait type parameter bounds类型参数 [W] 不符合 trait 类型参数界限
【发布时间】:2015-02-07 14:27:16
【问题描述】:
trait SomeClass {
    ...
}

trait AnotherClass[+V <: SomeClass] {
    ...
}

trait SomeAnotherClass[+V <: SomeClass] {
     protected def someFunc[W >: V](anotherClass: AnotherClass[W]) = {
          ...
     }
}

我收到此错误:

type arguments [W] do not conform to trait AnotherClass's type parameter bounds [+V <: SomeClass]
[error]   protected def someFunc[W >: V](anotherClass: AnotherClass[W]) = ...
[error]                                                    ^
[error] one error found

当我执行 [W &gt;: V &lt;: SomeClass] 而不仅仅是 [W &gt;: V] 时,我没有收到错误,但在这种情况下,它会隐藏变量。请帮忙,如何解决这个问题。

更新:

protected def someFunc(anotherClass: AnotherClass[V]) = {
              ...
}

我收到错误covariant type V occurs in contravariant position in type

【问题讨论】:

    标签: scala scala-2.10


    【解决方案1】:

    当您说W &gt;: V 时,您是说someFunc 的类型参数W 必须具有V 的类型下限。这意味着W 可以是V 或其任何超类型,这将打破V &lt;: SomeClass 的类型界限。

    例如Any &gt;: SomeClass,所以W 在这种假设情况下可能是Any,但Any = V &lt;: SomeClass 也不是真的,所以类型界限打破了。

    当您说W &gt;: V &lt;: SomeClass 时,W下限为V上限为SomeClassWSomeClass 的上限很重要,因为AnotherClass 的包含类型也有SomeClass 的上限。没有它,它会尝试允许AnotherClass[Any](或其他一些不是SomeClass 的超类型),当然它不能。

    你怎么能解决这个问题?你让你选择一种方法来做到这一点。您不能同时拥有W &gt;: VAnotherClass[+V &lt;: SomeClass]。它只是行不通,因为类型边界冲突。

    【讨论】:

    • 你说接受 AnotherClass[V] 应该没问题。但是,protected def someFunc(anotherClass: AnotherClass[V]) 给出错误covariant type V occurs in contravariant position in type AnotherClass
    • 我在这里修复了我的答案以解释为什么它适用于W &gt;: V &lt;: SomeClass,我之前的评论是错误的。我不知道为什么你想让它从上面不受限制。
    猜你喜欢
    • 1970-01-01
    • 2019-02-14
    • 2019-12-18
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    相关资源
    最近更新 更多