scala - (泛型)之间有什么区别吗

标签 scala generics

我有以下几点:

def someFunc(value: MyType = MyType()): MyType

以下是否有任何不同:
def someFunc[T >: MyType](value: T = MyType()): T

最佳答案

让我们看看如果我拿一个 String 会发生什么并尝试将其传递给 someFunc[T >: MyType] :

定义:

trait MyType
def someFunc[T <: MyType](value: T = new MyType { }): T = value

调用:
someFunc("hello")

产量
hello

这怎么可能?因为您已指定 MyType成为 lower boundT ,这意味着我们有 MyType >: T <: Any .这对 String 有何作用?如果我们查看类型 T成为 AnyRef , String 的父类(super class)型,然后是 MyType >: AnyRef <: Any关系类型检查。

回答您的问题:不,它们不相同,因为我无法通过 String到第一种方法 MyType .

如果你想问的是:
def someFunc[T <: MyType]


def someFunc(value: MyType)

是等价的,意思是 T有一个上限而不是下限,那么现在这两种方法都要求您传递 MyType 的子类型,但这里真正的区别在于该方法的返回类型始终至少与 MyType 一样具体。 ,如果您想对具体类型进行操作,这可能很有用。

关于scala - (泛型)之间有什么区别吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46887631/

相关文章:

Scala:如何在没有匹配关键字的情况下使用 case 关键字?

scala - Spark 对分隔数据进行排序

algorithm - Scala 提取列表中相差 1 (Ints) 的邻居

java - 使用泛型重载方法

Java 通用类的可分配性

java - 使用带有扩展的泛型的接口(interface)中重写方法的返回类型的意外行为

swift - 如何将通用序列参数约束为 Swift 3 中的元组?

c# - 给定一个受约束的泛型方法,我可以调用一个传递泛型参数实际类型的非泛型方法吗

scala - Spark-Elasticsearch使用Spark从Elasticsearch获取过滤的记录

Scala/Play 框架参数名称中带点