为什么';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
as
U我已经解决了定义
U
as
U的问题