我有以下内容:
def someFunc(value: MyType = MyType()): MyType
以下是否有任何不同之处:
def someFunc[T >: MyType](value: T = MyType()): T
答案 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
一样具体,如果您想对具体类型进行操作,这可能很有用。