我有以下代码:
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"))
}
答案 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)
实际上很难理解你在这里想要达到的目标,但你应该考虑两件事:
TSample
接受参数,因此Tlike[TSample]
是非常复杂的类型TSample.apply
参数中没有提示类型参数T
应该是什么,默认情况下会推断为Nothing
例如,这将编译
A[TLike[TSample1[_]]](TSample1[TSample1[_]]("dumb"))
Whis也会:
A[TLike[Nothing]](TSample1("dumb"))
后者等同于
A(TSample1("dumb"))
没有任何类型规范