【问题标题】:Scala: def method[A](some params) vs def method(some params)Scala:def方法[A](一些参数)与def方法(一些参数)
【发布时间】:2013-08-29 12:23:32
【问题描述】:

我很难找到这被称为什么以及定义这样的方法之间到底有什么区别:

def method[A](//...//) {}

def method(//...//) {}

另外,def method[A]def method[Any] 一样吗?

我们将不胜感激。

【问题讨论】:

    标签: scala


    【解决方案1】:

    def method[A] 定义了一个通用类型 A。像这样使用,没有细化,它是一个可以被任何类型满足的通配符。 (您可以使用[A <: Foo] 之类的语法指定只允许某些子类型,其中Foo 是您定义的类或特征。)

    您为什么要这样做?最有可能的是,您想要一个返回与作为参数相同的类型的方法(或其一些变体——也许它需要一个该类型的列表并返回一个该类型的数组):

    def method[A](a: A): A = ...
    

    因为你对A一无所知,所以它和Any一样通用。

    现在,A 没有什么特别之处。你可以放任何东西,甚至是Any:

    def method[Any](a: Any) ...    // Don't do this!
    

    但这会非常令人困惑,因为这不是您的标准Any 类型,它位于继承层次结构的顶部——它是一个类似于A 的泛型类型,但名称更长。

    如果您不需要使用泛型类型,请省略 [A]。例如:

    def printed[A](a: A): A = { println(a); a }   // Generic necessary
    def printMe(a: Any) { println(a) }            // Not necessary, returns Unit
    

    【讨论】:

    • 这是有道理的,尽管我会假设我在尝试以下操作时会遇到问题:def method[Int](a: List[String]): String = { "foo" } 但这适用于 REPL... 想法? (谢谢)我没有因为我没有使用泛型而遇到问题吗?我在没有 [A] 的情况下尝试了您的 printed 函数,但我被咆哮了......
    • @MCP - 尝试在该方法中使用Int!你会发现它不是你说的Int,而是一个泛型。 (所以,没有 + 或任何东西。)请注意,第一个评论说 generic required,所以是的,你会被骂!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2014-12-12
    • 2015-10-14
    • 2018-07-14
    • 1970-01-01
    相关资源
    最近更新 更多