如何接受在 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 &lt;: Base

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

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

【讨论】:

以上是关于如何接受在 Scala 中扩展类的泛型的主要内容,如果未能解决你的问题,请参考以下文章

Scala的泛型

如何在 C# 的泛型中使用扩展

17.scala的泛型类

通过给定的泛型类型 Scala 获取类的伴随对象

使用 psalm 扩展接口的泛型

如何在 Scala 中扩展包含泛型方法的 Java 接口?