Scala 泛型类方法调用的类型不匹配 请考虑下面的小例子: class C[P](val list: Seq[P]){ def print(e: P){ println(e) } } object Test{ def g[P](c: C[P]) = { c.print(c.list(0)) } def f(i: Int): C[_] = { i match { case 1 => new C(Seq(1, 2, 3)) case _ => new C(Seq("A", "B", "C")) } } def main(args: Array[String]): Unit = { val c = f(1) g(c) // works c.print(c.list(0)) // does not work } }

Scala 泛型类方法调用的类型不匹配 请考虑下面的小例子: class C[P](val list: Seq[P]){ def print(e: P){ println(e) } } object Test{ def g[P](c: C[P]) = { c.print(c.list(0)) } def f(i: Int): C[_] = { i match { case 1 => new C(Seq(1, 2, 3)) case _ => new C(Seq("A", "B", "C")) } } def main(args: Array[String]): Unit = { val c = f(1) g(c) // works c.print(c.list(0)) // does not work } },scala,Scala,我的问题是,在main函数中,为什么第一个调用会编译,而第二个调用会出现“类型不匹配”错误 有没有其他(更好的)方法来实现这里的目的 编辑1: 根据@chengpohi的回答,我可以将f返回值的类型更改为C[Any],但这通常不起作用。例如,如果我们将代码更改为 class B[P] class BInt extends B[Int] class BString extends B[String] class C[P](val list: Seq[P], val obj: B[P]) {

我的问题是,在main函数中,为什么第一个调用会编译,而第二个调用会出现“类型不匹配”错误

有没有其他(更好的)方法来实现这里的目的

编辑1

根据@chengpohi的回答,我可以将
f
返回值的类型更改为
C[Any]
,但这通常不起作用。例如,如果我们将代码更改为

class B[P]

class BInt extends B[Int]

class BString extends B[String]

class C[P](val list: Seq[P], val obj: B[P]) {
  def print(e: P) {
    println(e)
  }
}

object Test {
  def g[P](c: C[P]) = {
    c.print(c.list(0))
  }

  def f(i: Int): C[_] = {
    i match {
      case 1 => new C(Seq(1), new BInt)
      case _ => new C(Seq("String"), new BString)
    }
  }

  def main(args: Array[String]): Unit = {
    val c = f(1)
    g(c) // works
    c.print(c.list(0)) // does not work
  }
}
我无法再将
f
的返回类型更改为
C[Any]
(“类型不匹配”)

尝试设置
f
方法返回类型:
C[Any]
C[\u]
,对于类型
C[\u]
,编译器将
C[\u]
转换为
C

用于:

这个方法有效,这是因为我们在这个方法中绑定了
p
类型
g
,所以编译器可以推断出这个泛型
p
对象
类型)

但在主要方法中:

c.print(c.list(0))

c没有类型上下文,c的类型是
c[\u]
,但是
c.list
的类型是
Seq[Any]
,对于
c.print
中的泛型
p
将被认为是
\u$1
类型。因此,
类型不匹配
编译错误抛出。

您可以使用类型变量模式为类型参数命名:

f(1) match {
  case c: C[a] => c.print(c.list(0))
}

谢谢你的提示。我认为这类似于原始post.IMO中的
g
函数,这更像是一种变通方法,不能应用于更一般的情况,因为
C[\u]
应该意味着
C[a对于某些类型a]
,而这并不等同于
C[Any]
。请参阅我更新的帖子以获得更一般的示例。@MathFun为了便于编辑,您可以尝试将其转换为
C[Any]
,例如:
val res=i match{case 1=>new C(Seq(1),new BInt)case.\u=>new C(Seq(“String”),new BString)}res asInstanceOf[C[Any]
c.print(c.list(0))
f(1) match {
  case c: C[a] => c.print(c.list(0))
}