考虑以下 Scala 代码(例如,在 REPL 中)
object A{def foo:Unit = {}}
object B{def foo:Unit = {}}
def bar[T <: Any {def foo: Unit}](param: T*):Unit = param.foreach(x => x.foo)
bar(A, A) // works fine
bar(B, B) // works fine
bar(A, B) // gives error
前两个工作正常。第三个出现错误:
error: inferred type arguments [ScalaObject] do not conform to method bar's type parameter bounds [T <: Any{def foo: Unit}]
有什么方法可以做我想做的事吗?
这通常称为结构类型,而不是鸭子类型。我编辑了你的标题。 :)
我认为你的问题是由定义类型参数引起的T
然后以不变的方式使用它。T
只能引用一种具体类型,但你有不同类型的参数A
and B
.
这有效:
def bar(param: {def foo: Unit}*) = param.foreach(x => x.foo)
编辑:使用类型alias也有效:
type T = {def foo: Unit}
def bar(param: T*) = param.foreach(x => x.foo)
这是有效的,因为编译器将简单地替换结构类型来代替其别名,T
。替换后,这个例子和上面的一模一样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)