为什么';Scala在我的抽象类中以同样的方式推断类型参数吗?
我定义了两个特征:为什么';Scala在我的抽象类中以同样的方式推断类型参数吗?,scala,inheritance,abstract-class,type-inference,traits,Scala,Inheritance,Abstract Class,Type Inference,Traits,我定义了两个特征:A和BB扩展A。我还定义了一个类型参数化函数addOne,它将a的任何子类型作为输入参数。由于B扩展了A(请参见success),因此我可以使用B的实例作为输入调用此函数。然而,当我尝试在抽象类的上下文中做同样的事情时,这不再有效。我错过了什么 trait A { val a: Int } trait B extends A { val b: Int } def addOne[T <: A](t: T): Int = t.a + 1 def success[
A
和B
<代码>B扩展A
。我还定义了一个类型参数化函数addOne
,它将a
的任何子类型作为输入参数。由于B
扩展了A
(请参见success
),因此我可以使用B
的实例作为输入调用此函数。然而,当我尝试在抽象类的上下文中做同样的事情时,这不再有效。我错过了什么
trait A {
val a: Int
}
trait B extends A {
val b: Int
}
def addOne[T <: A](t: T): Int = t.a + 1
def success[U <: B](u: U): Int = addOne(u) // this works!
abstract class C[T <: A, U <: B] {
def addTwo(t: T): Int = t.a + 2
def fail(u: U): Int = addTwo(u) // this doesn't compile
}
trait A{
瓦拉:整数
}
特质B延伸到A{
val b:Int
}
def addOne[T之所以出现这种情况,是因为在C类中,虽然您知道U是B的子类型,而T是a的子类型,但您不能保证U是T的子类型
编辑:我想我已经找到了一种方法来做到这一点。它使用:
抽象类C[T之所以出现这种情况,是因为在类C中,虽然您知道U是B的子类型,而T是a的子类型,但您不能保证U是T的子类型
编辑:我想我已经找到了一种方法来做到这一点。它使用:
抽象类C[T我不知道什么是C建模,但我会说:
scala> class C[T <: A, U <: B] { def f(t: T) = t.a ; def g[X <: U with T](x: X) = f(x) }
defined class C
scala>class C[T我不知道什么是C建模,但我会说:
scala> class C[T <: A, U <: B] { def f(t: T) = t.a ; def g[X <: U with T](x: X) = f(x) }
defined class C
scala>C类[T好的。那么,我该如何表达U和T之间的关系?是的,我正试图找到一种方法来做到这一点,但没有太多的运气来约束T是好的。那么,我该如何表达U和T之间的关系呢?是的,我正试图找到一种方法来做到这一点,但没有太多的运气来约束T我已经解决了我的问题d定义U
asU我已经解决了定义U
asU的问题