scala - 无法在 Scala 中调用重载构造函数

标签 scala

我的代码如下所示:

val people = Array(Array("John", "25"), Array("Mary", "22"))
val headers = Seq("Name", "Age")
val myTable = new Table(people, headers)

我收到此语法错误:

overloaded method constructor Table with alternatives:
    (rows: Int,columns: Int)scala.swing.Table 
    <and>
    (rowData: Array[Array[Any]],columnNames: Seq[_])scala.swing.Table
    cannot be applied to
    (Array [Array[java.lang.String]], Seq[java.lang.String])

我不明白为什么不使用第二种选择。 “任何”和“_”之间有什么区别让我困惑吗?

最佳答案

正如 Kim 已经说过的,你需要使你的数组​​在他的元素类型中协变,因为 Scala 的 Arras 不像 Java/C# 那样是协变的。

例如,此代码将使其工作:

class Table[+T](rowData: Array[Array[T]],columnNames: Seq[_])

这只是告诉编译器 T 应该是协变的(这类似于 Java 的 ? extends T 或 C# 的 out T)。

如果您需要更多地控制允许哪些类型和不允许哪些类型,您还可以使用:

class Table[T <: Any](rowData: Array[Array[T]],columnNames: Seq[_])

这将告诉编译器 T 可以是 Any 的任何子类型(可以从 Any 更改为您需要的类,就像示例中的 CharSequence 一样)。

在这种情况下,两种情况的工作原理相同:

scala> val people = Array(Array("John", "25"), Array("Mary", "22"))
people: Array[Array[java.lang.String]] = Array(Array(John, 25), Array(Mary, 22))   

scala> val headers = Seq("Name", "Age")
headers: Seq[java.lang.String] = List(Name, Age)

scala> val myTable = new Table(people, headers)
myTable: Table[java.lang.String] = Table@350204ce

编辑:如果相关类不在您的控制范围内,请明确声明您想要的类型,如下所示:

val people: Array[Array[Any]] = Array(Array("John", "25"), Array("Mary", "22"))
<小时/>

更新

这是有问题的源代码:

// TODO: use IndexedSeq[_ <: IndexedSeq[Any]], see ticket [#2005][1]
def this(rowData: Array[Array[Any]], columnNames: Seq[_]) = {

我想知道是否有人忘记删除解决方法,因为 #2005 自 2011 年 5 月以来已修复......

关于scala - 无法在 Scala 中调用重载构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6735698/

相关文章:

java - 从 scala 访问 Java 字段注释

scala - 带有 ClassTags/TypeTags 的模式匹配函数签名

scala - 如何创建可应用于包含相同参数的两种或多种类型的泛型函数?

scala - 更改 build.sbt 自定义任务中的版本

scala - 在 Play Framework 2.0 模板中使用选项帮助器

java - Play Framework - 删除对象后无法在 session 中找到用户 ID

Scala:如何在编译时不知道类型的情况下调用具有类型参数和 list 的方法?

scala - 在嵌套 for 循环中 if 后的产量

scala - FnToProduct 不适用于类型构造函数

java - 为 Spark 创建 JAR