【发布时间】:2020-09-10 09:41:09
【问题描述】:
我最近开始学习 Scala。而且我不明白为什么这段代码不起作用。有人可以帮帮我吗?
import scala.collection.mutable
import scala.collection.mutable.Map
class Bijection[T] (val v: Set[T]) {
private var addition = 0
private var reversed = false
def add(i: Int)(implicit ev: T <:< Int) = {
addition += i
}
def reverse(implicit ev: T <:< String) = {
reversed = !reversed
}
}
object Bijection {
def apply(s: Set[String]): Bijection[String] = {
println("Hello string")
Bijection(s)
}
def apply[T](s: Set[T]): Bijection[T] = {
println("Hello T")
Bijection(s)
}
}
object Main {
def main(args: Array[String]): Unit = {
var x = Bijection[String](Set[String]("fd", "fasf"))
}
}
此代码应打印“Hello” 但我现在得到下一个踪迹。
Error:(23, 7) double definition:
def apply(s: Set[String]): Bijection[String] at line 18 and
def apply[T](s: Set[T]): Bijection[T] at line 23
have same type after erasure: (s: scala.collection.immutable.Set)Bijection
def apply[T](s: Set[T]): Bijection[T] = {
【问题讨论】:
-
使用new不会调用main中的apply方法。正如上面的评论所提到的,您需要删除新的 keyward 才能调用 Bijection.apply。 (你不需要 [String] 类型参数)最后你还需要显式或隐式地提供预期的参数忽略
-
@user 你是天才!非常感谢您提出这个问题和以前的问题。
-
我更新问题@user 你能看到吗?
-
你不能在你的apply方法中只使用
Bijection(s),因为这会再次调用apply方法,导致递归。相反,在那里调用实际的构造函数,并将您的主构造函数设为私有。 -
是,但错误现在不在递归中。
标签: java scala abstract-class generic-programming