【发布时间】:2018-11-25 18:35:35
【问题描述】:
我有一个简单的场景,在使用 Scala 泛型时会产生类型不匹配,目前尚不清楚为什么或如何解决它。
trait Foo
case class Bar() extends Foo
trait FooGetter[T <: Foo] {
def get: T = Bar() // Error
}
错误:
类型不匹配;成立 : 需要酒吧:T
有什么提示吗?
【问题讨论】:
-
那么您将
T声明为Foo的子类型,而Bar是Foo的子类型。这并不能保证它将是Foo的任何子类型。例如,如果您创建了另一个类Bazz,它也从Foo扩展,并尝试在Bazz中创建参数化的FooGetter实例,那么 get 上的Bar实例将是类型不匹配。跨度> -
@LuisMiguelMejíaSuárez 我希望能够从我的方法中返回
Bar()。在那种情况下,我应该如何声明它来编译? -
好吧,您可以更改类型签名以返回
Bar,但随后类型参数和特征本身就变得不必要了。我认为您真正想要的是能够通过调用FooGeter[Bar].get之类的东西来隐式地获取 Foot 的正确实例。 -
我认为您应该编辑问题以更好地解释主要问题,并提供尽可能多的细节。
-
如果你希望所有返回的东西都被视为
Foo,为什么不将返回类型指定为Foo?您仍然可以在实现中返回Bar(),但对于FooGetter接口的用户,它将是任何Foo