重载方法值适用于替代方案

时间:2015-10-24 21:06:00

标签: scala

我有以下代码:

case class A[T](a:T, b:Array[Int])
object A {
  def apply[T](aa:T):A[T] = A(aa, Array(1, 2, 3))
}

trait TLike[T]
case class TSample1[T](str:String) extends TLike[T]

为什么我从类型I的A实例化会出现以下错误:

object tmp extends App{
  val a = A[TLike[TSample1]](TSample1("dumb"))
}

错误:

overloaded method value apply with alternatives:
  (a: TLike[TSample1],b: Array[Int])A[TLike[TSample1]] <and>
  (aa: TLike[TSample1])A[TLike[TSample1]]
 cannot be applied to (TSample1[Nothing])
  val a = A[TLike[TSample1]](TSample1("dumb"))

但是如果我把它留给Scalac它可以正常工作:

object tmp extends App{
      val a = A(TSample1("dumb"))
    }

2 个答案:

答案 0 :(得分:1)

如果我们从您编译的案例开始,请调用object A的{​​{1}}方法,该方法按预期工作。

如果我们稍后转到不编译的示例并查看编译错误:

apply

它说它找到了两个Main.scala:10: error: overloaded method value apply with alternatives: (a: TLike[TSample1],b: Array[Int])A[TLike[TSample1]] <and> (aa: TLike[TSample1])A[TLike[TSample1]] cannot be applied to (TSample1[Nothing]) val a = A[TLike[TSample1]](TSample1("dumb")) ^ one error found 方法,一个是您定义的方法,另一个是标准apply方法(如果需要,请阅读更多相关信息)。

我猜你试着调用这个方法:

case class

但是,您无法使用模板调用def apply[T](aa:T):A[T] = A(aa, Array(1, 2, 3))对象的apply函数。另一个调用不匹配,因为它还需要一个数组。此类型A也不等于TLike[TSample1]

答案 1 :(得分:0)

实际上很难理解你在这里想要达到的目标,但你应该考虑两件事:

  1. TSample接受参数,因此Tlike[TSample]是非常复杂的类型
  2. 因为TSample.apply参数中没有提示类型参数T应该是什么,默认情况下会推断为Nothing
  3. 例如,这将编译

    A[TLike[TSample1[_]]](TSample1[TSample1[_]]("dumb"))
    

    Whis也会:

    A[TLike[Nothing]](TSample1("dumb"))
    

    后者等同于

    A(TSample1("dumb"))
    

    没有任何类型规范