【发布时间】:2013-08-29 12:23:32
【问题描述】:
我很难找到这被称为什么以及定义这样的方法之间到底有什么区别:
def method[A](//...//) {}
或
def method(//...//) {}
另外,def method[A] 和 def method[Any] 一样吗?
我们将不胜感激。
【问题讨论】:
标签: scala
我很难找到这被称为什么以及定义这样的方法之间到底有什么区别:
def method[A](//...//) {}
或
def method(//...//) {}
另外,def method[A] 和 def method[Any] 一样吗?
我们将不胜感激。
【问题讨论】:
标签: scala
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 函数,但我被咆哮了......
Int!你会发现它不是你说的Int,而是一个泛型。 (所以,没有 + 或任何东西。)请注意,第一个评论说 generic required,所以是的,你会被骂!