类型不匹配,预期ListBuffer [Any],实际ListBuffer [CustomClass]

时间:2017-11-16 10:49:47

标签: scala class types casting

我不明白标题错误,知道这个功能:

def myFunction(objectList: ListBuffer[Any], `object`: Any): Boolean = {...}
用这些参数调用

myFunction(
  objectList // :ListBuffer[CustomClass],
  customObject // :CustomObject
)

我不得不打电话给这样的功能:

myFunction(
  objectList.asInstanceOf[ListBuffer[Any]],
  customObject
)

仅为ListBuffer参数生成不匹配类型错误。 所以CustomObject =>一切都好,但没有ListBuffer [CustomObject] => ListBuffer [Any]?

谢谢

4 个答案:

答案 0 :(得分:1)

多数民众赞成因为ListBuffer不变,所以你无法将ListBuffer[A]分配给ListBuffer[SuperTypeOfA],原因是ListBuffer是可变的,这使{{1}不安全}}。 https://docs.scala-lang.org/tour/variances.html

答案 1 :(得分:0)

您正在使用参数名称对象,它是scala中的关键字。

def myFunction(objectList: ListBuffer[Any], customObject: Any): Boolean = {...}

如果您想将对象作为参数名称,请在其前面使用倾斜符号。

def myFunction(objectList: ListBuffer[Any], `object`: Any): Boolean = {...}

其他问题是你无法使用asInstanceOf。因此,将ListBuffer [Any]更改为ListBuffer [CustomClass]

def myFunction(objectList: ListBuffer[CustomClass], customObject: Any): Boolean = {...}

答案 2 :(得分:0)

嗯,所以或者这不是一个好用的集合,并且有一个更好的要么我使用它很糟糕并且不能将它提供给函数但是初始化为函数而不是?

我认为Seq是协变的,因为定义函数如下,这有效:

def myFunction(objectList: Seq[Any], object: Any): Boolean = {...}

答案 3 :(得分:0)

如果(lldb) po UIFont.fontNames(forFamilyName: "BiauKai") CustomObject实际上应该是相同的(或CustomClassCustomObject的子类型),您可能希望将该函数更改为通用:

CustomClass

否则,问题是def myFunction[A](objectList: ListBuffer[A], object: A) = ... 可以将任何内容放入myFunction,但如果您传递ListBuffer[Any],则只能将ListBuffer[CustomClass]类型的值放入其中。这解释了为什么CustomClass是不变的。

如果ListBuffer不会在myFunction中添加任何内容,您可以使用Buffer(或更常见的类型),其中 协变。您可以在Seq处传递,因为它会延伸ListBuffer。通常,为方法参数提供最通用的类​​型是一个很好的策略。