gpt4 book ai didi

java - Scala 中的泛型类型

转载 作者:行者123 更新时间:2023-12-01 16:34:58 25 4
gpt4 key购买 nike

我最近开始学习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]]
}

您无需更改任何其他内容。

Scastie

关于java - Scala 中的泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61973816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com