首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala中的泛型类型

Scala中的泛型类型
EN

Stack Overflow用户
提问于 2020-05-23 22:46:10
回答 1查看 57关注 0票数 0

我最近开始学习Scala。我不明白为什么这段代码不能工作。有人能帮我吗?

代码语言:javascript
复制
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“,但我现在得到了下一个跟踪。

代码语言:javascript
复制
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] = {
EN

回答 1

Stack Overflow用户

发布于 2020-05-23 23:38:26

JVM没有reified generics,相反,它在运行时使用erases type parameters,即使它们存储在字节码中。它有类型参数的唯一原因是为了在编译时进行检查。正因为如此,您的两个apply方法都将具有签名。

代码语言:javascript
复制
def apply(s: Set): Bijection

在运行时。

因此,无法选择正确的应用方法。

此外,您必须在apply方法内部调用构造函数。如果您不使用new,那么您将再次调用相同的apply方法,进入无限递归。

相反,您可以这样做。如果它不是一个字符串,隐式参数将保持为空,您将知道它不是一个String,而是另一个T

代码语言:javascript
复制
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]]
}

你不需要改变任何其他的东西。

Scastie

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61973816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档