gpt4 book ai didi

scala 泛型函数返回类型

转载 作者:行者123 更新时间:2023-12-04 14:55:59 24 4
gpt4 key购买 nike

我尝试编写一个具有通用返回类型的函数,但除非我强制转换返回类型,否则它不起作用。请看功能getSomething()下面我预计它可以在没有 Actor 的情况下工作。我在这里可能做错了什么?

trait Sup

class Sub extends Sup {
def getString = "I am Sub"
}

class Sub2 extends Sup {
def getInt = 100
}

def getSomething[A <: Sup](str: String) : A = {
str match {
case "sub" => getSub.asInstanceOf[A]
case "sub2" => getSub2.asInstanceOf[A]
}
}

def getSub(): Sub = {
new Sub
}

def getSub2() : Sub2 = {
new Sub2
}

val x = getSomething[Sub]("sub").getString
val y = getSomething[Sub2]("sub2").getInt

最佳答案

正如阿列克谢所说,instanceOf需要强制在预期类型和返回的对象类型之间建立链接。这相当于说:“编译器,相信我,我会给你一个'A'”,这不是很安全,因为它取决于我们提供正确的类型。

如果我们希望类型系统为我们解决问题,我们需要给它一些额外的信息。在 Scala 中这样做的一种方法是定义一些工厂,该工厂知道如何生成我们的类型的实例和允许该工厂返回我们特定类型的证据。

这是上面介绍这种结构并使用 ContextBounds 的代码的一个版本获得我们想要的类型的正确工厂实例。

trait Sup 

class Sub extends Sup {
val str = "I'm a Sub"
}

class Sub2 extends Sup {
val number = 42
}

trait SupProvider[T <: Sup] {
def instance:T
}

object SupProvider {
def getSomeSup[T<:Sup:SupProvider]: T = implicitly[SupProvider[T]].instance
implicit object SubProvider extends SupProvider[Sub] {
def instance = new Sub
}
implicit object Sub2Provider extends SupProvider[Sub2] {
def instance = new Sub2
}
}

SupProvider.getSomeSup[Sub].str
// res: String = I'm a Sub

SupProvider.getSomeSup[Sub2].number
// res: Int = 42

关于scala 泛型函数返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40441410/

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