【问题标题】:overloaded method value apply with alternatives重载方法值适用于替代方案
【发布时间】:2015-10-24 21:06:00
【问题描述】:

我有以下代码:

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]

为什么如果我从 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"))
    }

【问题讨论】:

  • 您对TLikeTSample 中的类型参数T 的预期用途是什么?例如,TSample[Int]TSample[Char] 有何不同?它们都将采用String 参数,如所写,但既不是TSample[String]TLike[String] 类型,也不是IntChar 实例。我想知道这个因素是否会混淆您在tmp 中的使用。
  • @Shadowlands 我已经将我的代码简化为这个,所以我可以问这个问题,我的代码的其他部分需要 T 特征。

标签: scala


【解决方案1】:

如果我们从您编译的案例开始,您调用object Aapply 方法,该方法按预期工作。

如果我们后面再去不编译的例子,看看编译错误:

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))

但是,您不能使用模板调用 A 对象的 apply 函数。另一个调用不匹配,因为它也需要一个数组。 TLike[TSample1] 的类型也不等于 TSample1

【讨论】:

  • 不应该混淆apply方法的args,因为一个(案例类)有两个参数参数,另一个(对象)有一个参数
  • 一个object 被实例化一次,因此你不能像你那样使用模板参数调用它。类型也错了。请再次阅读我回答中的最后一句话。
【解决方案2】:

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

  1. TSample 接受参数,所以 Tlike[TSample] 是相当复杂的类型
  2. 由于TSample.apply的参数中没有提示T应该是什么类型参数,默认情况下会推断为Nothing

这个例子会编译

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

Whis 也会:

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

后者等价于

A(TSample1("dumb"))

没有任何类型说明

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2018-02-17
    • 2021-09-12
    • 1970-01-01
    相关资源
    最近更新 更多