如何接受在 Scala 中扩展类的泛型
Posted
技术标签:
【中文标题】如何接受在 Scala 中扩展类的泛型【英文标题】:How do I accept a generic that extends a class in Scala 【发布时间】:2022-01-23 20:28:30 【问题描述】:我有类似以下的东西......
class Base
def doSomething = ...
class B extends Base
val text = "foo"
...
class C extends Base
val value = "bar"
我想要一个接受任何扩展 Base 但保留其扩展属性的类的方法。我试过这个...
def myMethod[A extends Base](obj: A): Unit
...
但这没有用。如何创建允许这样做的方法?
【问题讨论】:
[A <: Base]
额外字符,以便我发表评论。
@LuisMiguelMejíaSuárez 不要在 cmets 中回答问题,请在答案中回答以便可以接受。
它不是真正的类型,因为我使用的是 Java 语法而不是 Scala 我会说这确实构成并回答了
这不应该被关闭。这是由于语法误解,而不是拼写错误。刚刚学习 Scala 的 Java 开发人员可能会从这个问题和 Luis 的回答中得到帮助。
@SwiftMango 你是对的,这不是一个论坛,但 OP 的问题完全符合问答格式(它清楚地说明了问题并有明确的答案)。仅仅因为在评论中回答了问题并不意味着它不再可重现。我不同意关闭投票背后的两个原因,所以我投票重新开放。
【参考方案1】:
您正在寻找的概念是上界类型。子类型关系的standard notation 是<:
。这种精确的符号也用在 Scala 语法中来表示类型界限:
// upper type bound, `A` must be subtype of `U`,
// analogous to Java's "A extends U"
def foo[A <: U]: Unit = ???
// lower type bound, `A` must be supertype of `L`,
// analogous to Java's "A super L"
def bar[A >: L]: Unit = ???
// Both upper and lower bounds simultaneously:
def baz[A >: U <: L]: Unit = ???
在您的情况下,A
应该是Base
的子类型,即它应该由上面的Base
界定:A <: Base
def myMethod[A <: Base](obj: A): Unit
...
另一个需要牢记的重要区别是来自 Java 时,在 Scala 中,您可能会出现使用站点差异以及声明站点差异。
【讨论】:
以上是关于如何接受在 Scala 中扩展类的泛型的主要内容,如果未能解决你的问题,请参考以下文章