作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近开始学习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] = {
最佳答案
JVM 没有 reified generics ,相反,它 erases type parameters在运行时,即使它们存储在字节码中。它具有类型参数的唯一原因是在编译时进行检查。因此,您的 2 个 apply 方法都将具有签名。
def apply(s: Set): Bijection
运行时。
因此,无法选择正确的应用方法。
此外,您必须在 apply 方法中调用构造函数。如果您不使用 new
,那么您将再次调用相同的 apply 方法,从而进入无限递归。
相反,你可以做这样的事情。如果它不是字符串,则隐式参数将保持为 null,并且您将知道它不是 String
而是其他一些 T
。
object Bijection {
private def applyString(s: Set[String]): Bijection[String] = {
println("Hello String")
new Bijection(s)
}
private def applyT[T](s: Set[T]): Bijection[T] = {
println("Hello T")
new Bijection(s)
}
def apply[T](s: Set[T])(implicit ev: Set[T] =:= Set[String] = null): Bijection[T] =
if (ev == null) applyT(s) else applyString(s).asInstanceOf[Bijection[T]]
}
您无需更改任何其他内容。
关于java - Scala 中的泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61973816/
我是一名优秀的程序员,十分优秀!