(仿制药)之间有什么区别吗

时间:2017-10-23 10:54:35

标签: scala generics

我有以下内容:

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

以下是否有任何不同之处:

def someFunc[T >: MyType](value: T = MyType()): T

1 个答案:

答案 0 :(得分:2)

如果我选择String并尝试将其传递给someFunc[T >: MyType],我们会看到会发生什么:

定义:

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

调用:

someFunc("hello")

产量

hello

这怎么可能?因为您已将MyType指定为T的{​​{3}},这意味着我们有MyType >: T <: Any。这对String有什么用?如果我们将T类型视为AnyRef,超类型为String,则MyType >: AnyRef <: Any关系类型会进行检查。

回答你的问题:不,它们不相同,因为我无法将String传递给第一个采用MyType的方法。

如果您要问的是:

def someFunc[T <: MyType]

def someFunc(value: MyType)

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