简体   繁体   English

在Scala中,为什么下限在这里不能正常工作?

[英]In scala, why doesn't lower bound work well here?

These codes compiles well: 这些代码可以很好地编译:

  abstract class CodeTree

  case class Fork(left: CodeTree, right: CodeTree, chars: List[Char], weight: Int) extends CodeTree

  case class Leaf(char: Char, weight: Int) extends CodeTree


  def weight(tree: CodeTree): Int = tree match {
    case Fork(left, right, chars, weight) => weight
    case Leaf(char, weight) => weight
  }

  def insert_orderedCodeTreeList[T >: CodeTree](leaf: CodeTree, orderedCodeTrees: List[CodeTree]): List[T] = orderedCodeTrees match {
    case Nil => List(leaf)
    case head :: tail => {
      if (weight(leaf) <= weight(head)) leaf :: orderedCodeTrees
      else head :: insert_orderedCodeTreeList(leaf, tail)
    }
  }

But it will throw errors when I used it like this: 但是当我这样使用它时会抛出错误:

insert_orderedCodeTreeList[Leaf](Leaf(theChar, theInt), makeOrderedLeafList(tail))

type arguments [patmat.Huffman.Leaf] do not conform to method insert_orderedCodeTreeList's type parameter bounds [T >: patmat.Huffman.CodeTree]
[error]     case (theChar, theInt) :: tail => insert_orderedCodeTreeList[Leaf](Leaf(theChar, theInt), makeOrderedLeafList(tail))
[error]                                                                 ^
[error] one error found

As can be seen, the type parameter T uses CodeTree as lower bound, therefore, I think it might be OK to replace CodeTree with T in the parameter list of insert_orderedCodeTreeList : 可以看出,类型参数T使用CodeTree作为下限,因此,我认为可以在insert_orderedCodeTreeList的参数列表中用T替换insert_orderedCodeTreeList

  def insert_orderedCodeTreeList[T >: CodeTree](leaf: T, orderedCodeTrees: List[T]): List[T] = orderedCodeTrees match {
    case Nil => List(leaf)
    case head :: tail => {
      if (weight(leaf) <= weight(head)) leaf :: orderedCodeTrees
      else head :: insert_orderedCodeTreeList(leaf, tail)
    }
  }

However, the compiler complains about that: 但是,编译器抱怨:

[error]  found   : T
[error]  required: patmat.Huffman.CodeTree
[error]       if (weight(leaf) <= weight(head)) leaf :: orderedCodeTrees
[error]                                  ^

Does anyone have ideas about this? 有人对此有想法吗?

After reading the document about bounds , I found the correct way is to write like this: 阅读有关边界的文档后,我发现正确的方法是这样写:

  def insert_orderedCodeTreeList[T <: CodeTree](leaf: T, orderedCodeTrees: List[T]): List[T] = orderedCodeTrees match {
    case Nil => List(leaf)
    case head :: tail => {
      if (weight(leaf) <= weight(head)) leaf :: orderedCodeTrees
      else head :: insert_orderedCodeTreeList(leaf, tail)
    }
  }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM