【问题标题】:How do I accept a generic that extends a class in Scala如何接受在 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 的问题完全符合问答格式(它清楚地说明了问题并有明确的答案)。仅仅因为在评论中回答了问题并不意味着它不再可重现。我不同意关闭投票背后的两个原因,所以我投票重新开放。

标签: scala generics


【解决方案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 &lt;: Base

def myMethod[A <: Base](obj: A): Unit{
  ...
}

另一个需要牢记的重要区别是来自 Java 时,在 Scala 中,您可能会出现使用站点差异以及声明站点差异。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多